Skip to content

Commit 5a8b92c

Browse files
committed
Improve relay_init related
1 parent 8170aaa commit 5a8b92c

2 files changed

Lines changed: 45 additions & 12 deletions

File tree

plugwise_usb/messages/requests.py

Lines changed: 7 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
CirclePlusRealTimeClockResponse,
2727
CirclePlusScanResponse,
2828
CirclePowerUsageResponse,
29+
CircleRelayInitStateResponse,
2930
EnergyCalibrationResponse,
3031
NodeAckResponse,
3132
NodeFeaturesResponse,
@@ -1510,11 +1511,12 @@ class CircleRelayInitStateRequest(PlugwiseRequest):
15101511
"""Get or set initial relay state after power-up of Circle.
15111512
15121513
Supported protocols : 2.6
1513-
Response message : NodeAckResponse # CircleInitRelayStateResponse
1514+
Response message : NodeAckResponse for set
1515+
: CircleInitRelayStateResponse for get
15141516
"""
15151517

15161518
_identifier = b"0138" # PWCircleGetSetInitialRelaisStateRequestV2_6
1517-
_reply_identifier = b"0100" # b"0139" # PWCircleGetSetInitialRelaisStateReplyV2_6
1519+
_reply_identifier = b"0139" | b"0100" # PWCircleGetSetInitialRelaisStateReplyV2_6
15181520

15191521
def __init__(
15201522
self,
@@ -1530,13 +1532,13 @@ def __init__(
15301532
self.relay = Int(1 if relay_state else 0, length=2)
15311533
self._args += [self.set_or_get, self.relay]
15321534

1533-
async def send(self) -> NodeAckResponse | None:
1535+
async def send(self) -> CircleRelayInitStateResponse | NodeAckResponse | None:
15341536
"""Send request."""
15351537
result = await self._send_request()
1536-
if isinstance(result, NodeAckResponse):
1538+
if isinstance(result, CircleRelayInitStateResponse | NodeAckResponse):
15371539
return result
15381540
if result is None:
15391541
return None
15401542
raise MessageError(
1541-
f"Invalid response message. Received {result.__class__.__name__}, expected NodeAckResponse"
1543+
f"Invalid response message. Received {result.__class__.__name__}, expected CircleRelayInitStateResponse or NodeAckResponse"
15421544
)

plugwise_usb/nodes/circle.py

Lines changed: 38 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1140,28 +1140,59 @@ async def _relay_init_get(self) -> bool | None:
11401140
"Retrieval of initial state of relay is not "
11411141
+ f"supported for device {self.name}"
11421142
)
1143+
11431144
request = CircleRelayInitStateRequest(
11441145
self._send, self._mac_in_bytes, False, False
11451146
)
1146-
if (response := await request.send()) is not None:
1147+
if (response := await request.send()) is None:
1148+
_LOGGER.warning(
1149+
"No response from %s to get relay init setting", self._mac_in_str
1150+
)
1151+
return None
1152+
1153+
if isinstance(response, CircleRelayInitStateResponse):
1154+
_LOGGER.debug("Successful get of relay init state for %s", self._mac_in_str)
11471155
await self._relay_init_update_state(response.relay.value == 1)
1148-
return self._relay_config.init_state
1149-
return None
11501156

1151-
async def _relay_init_set(self, state: bool) -> bool | None:
1157+
_LOGGER.warning(
1158+
"Unexpected response type %s for %s",
1159+
response_type,
1160+
self._mac_in_str,
1161+
)
1162+
return
1163+
1164+
async def _relay_init_set(self, state: bool) -> None:
11521165
"""Configure relay init state."""
11531166
if NodeFeature.RELAY_INIT not in self._features:
11541167
raise NodeError(
11551168
"Configuring of initial state of relay is not"
11561169
+ f"supported for device {self.name}"
11571170
)
1171+
11581172
request = CircleRelayInitStateRequest(
11591173
self._send, self._mac_in_bytes, True, state
11601174
)
1161-
if (response := await request.send()) is not None:
1175+
if (response := await request.send()) is None:
1176+
_LOGGER.warning(
1177+
"No response from %s to configure relay init setting", self._mac_in_str
1178+
)
1179+
return None
1180+
1181+
if response.node_ack_type == NodeAckResponseType.DEFAULT_FAIL:
1182+
_LOGGER.warning("Failed to set relay init state for %s", self._mac_in_str)
1183+
return None
1184+
1185+
if response.node_ack_type == NodeAckResponseType.DEFAULT_ACK:
1186+
_LOGGER.debug("Successful set relay init state for %s", self._mac_in_str)
11621187
await self._relay_init_update_state(response.relay.value == 1)
1163-
return self._relay_config.init_state
1164-
return None
1188+
return
1189+
1190+
_LOGGER.warning(
1191+
"Unexpected response ack type %s for %s",
1192+
response.node_ack_type,
1193+
self.name,
1194+
)
1195+
return
11651196

11661197
async def _relay_init_load_from_cache(self) -> bool:
11671198
"""Load relay init state from cache. Returns True if retrieval was successful."""

0 commit comments

Comments
 (0)