diff --git a/homeassistant/components/zwave_js/api.py b/homeassistant/components/zwave_js/api.py index 81600ec6c16..e722cac9e09 100644 --- a/homeassistant/components/zwave_js/api.py +++ b/homeassistant/components/zwave_js/api.py @@ -239,9 +239,24 @@ async def websocket_add_node( 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"]} + ) + ) + @callback def node_added(event: dict) -> None: node = event["node"] + interview_unsubs = [ + node.on("interview started", forward_event), + node.on("interview completed", forward_event), + node.on("interview stage completed", forward_stage), + node.on("interview failed", forward_event), + ] + unsubs.extend(interview_unsubs) node_details = { "node_id": node.node_id, "status": node.status, @@ -255,7 +270,12 @@ async def websocket_add_node( @callback def device_registered(device: DeviceEntry) -> None: - device_details = {"name": device.name, "id": device.id} + device_details = { + "name": device.name, + "id": device.id, + "manufacturer": device.manufacturer, + "model": device.model, + } connection.send_message( websocket_api.event_message( msg[ID], {"event": "device registered", "device": device_details} diff --git a/tests/components/zwave_js/test_api.py b/tests/components/zwave_js/test_api.py index 57961ee89e4..f192c69b80a 100644 --- a/tests/components/zwave_js/test_api.py +++ b/tests/components/zwave_js/test_api.py @@ -155,7 +155,50 @@ async def test_add_node( msg = await ws_client.receive_json() assert msg["event"]["event"] == "device registered" # Check the keys of the device item - assert list(msg["event"]["device"]) == ["name", "id"] + assert list(msg["event"]["device"]) == ["name", "id", "manufacturer", "model"] + + # Test receiving interview events + event = Event( + type="interview started", + data={"source": "node", "event": "interview started", "nodeId": 53}, + ) + client.driver.receive_event(event) + + msg = await ws_client.receive_json() + assert msg["event"]["event"] == "interview started" + + event = Event( + type="interview stage completed", + data={ + "source": "node", + "event": "interview stage completed", + "stageName": "NodeInfo", + "nodeId": 53, + }, + ) + 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": 53}, + ) + 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": 53}, + ) + client.driver.receive_event(event) + + msg = await ws_client.receive_json() + assert msg["event"]["event"] == "interview failed" # Test sending command with not loaded entry fails await hass.config_entries.async_unload(entry.entry_id)