Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
35 changes: 32 additions & 3 deletions homeassistant/components/zwave_js/api.py
Original file line number Diff line number Diff line change
Expand Up @@ -367,14 +367,43 @@ async def websocket_refresh_node_info(
) -> None:
"""Re-interview a node."""
node_id = msg[NODE_ID]
node = client.driver.controller.nodes.get(node_id)
controller = client.driver.controller
node = controller.nodes.get(node_id)

if node is None:
connection.send_error(msg[ID], ERR_NOT_FOUND, f"Node {node_id} not found")
return

await node.async_refresh_info()
connection.send_result(msg[ID])
@callback
def async_cleanup() -> None:
"""Remove signal listeners."""
for unsub in unsubs:
unsub()

@callback
def forward_event(event: dict) -> None:
connection.send_message(
websocket_api.event_message(msg[ID], {"event": event["event"]})
)

@callback
def forward_stage(event: dict) -> None:
connection.send_message(
websocket_api.event_message(
msg[ID], {"event": event["event"], "stage": event["stageName"]}
)
)

connection.subscriptions[msg["id"]] = async_cleanup
unsubs = [
node.on("interview started", forward_event),
node.on("interview completed", forward_event),
Comment thread
MartinHjelmare marked this conversation as resolved.
node.on("interview stage completed", forward_stage),
node.on("interview failed", forward_event),
]

result = await node.async_refresh_info()
connection.send_result(msg[ID], result)


@websocket_api.require_admin # type:ignore
Expand Down
42 changes: 42 additions & 0 deletions tests/components/zwave_js/test_api.py
Original file line number Diff line number Diff line change
Expand Up @@ -250,6 +250,48 @@ async def test_refresh_node_info(
assert args["command"] == "node.refresh_info"
assert args["nodeId"] == 52

event = Event(
type="interview started",
data={"source": "node", "event": "interview started", "nodeId": 52},
)
client.driver.receive_event(event)

msg = await ws_client.receive_json()
assert msg["event"]["event"] == "interview started"

event = Event(
type="interview stage completed",
Comment thread
cgarwood marked this conversation as resolved.
data={
"source": "node",
"event": "interview stage completed",
"stageName": "NodeInfo",
"nodeId": 52,
},
)
client.driver.receive_event(event)

msg = await ws_client.receive_json()
assert msg["event"]["event"] == "interview stage completed"
assert msg["event"]["stage"] == "NodeInfo"

event = Event(
type="interview completed",
data={"source": "node", "event": "interview completed", "nodeId": 52},
)
client.driver.receive_event(event)

msg = await ws_client.receive_json()
assert msg["event"]["event"] == "interview completed"

event = Event(
type="interview failed",
data={"source": "node", "event": "interview failed", "nodeId": 52},
)
client.driver.receive_event(event)

msg = await ws_client.receive_json()
assert msg["event"]["event"] == "interview failed"

client.async_send_command_no_wait.reset_mock()

await ws_client.send_json(
Expand Down