diff --git a/homeassistant/components/knx/project.py b/homeassistant/components/knx/project.py index 274ef5cb9a3..d47241b174b 100644 --- a/homeassistant/components/knx/project.py +++ b/homeassistant/components/knx/project.py @@ -115,3 +115,7 @@ class KNXProject: """Remove project file from storage.""" await self._store.async_remove() self.initial_state() + + async def get_knxproject(self) -> KNXProjectModel | None: + """Load the project file from local storage.""" + return await self._store.async_load() diff --git a/homeassistant/components/knx/websocket.py b/homeassistant/components/knx/websocket.py index ad29fd19928..e3eb5de8530 100644 --- a/homeassistant/components/knx/websocket.py +++ b/homeassistant/components/knx/websocket.py @@ -27,6 +27,7 @@ async def register_panel(hass: HomeAssistant) -> None: websocket_api.async_register_command(hass, ws_project_file_remove) websocket_api.async_register_command(hass, ws_group_monitor_info) websocket_api.async_register_command(hass, ws_subscribe_telegram) + websocket_api.async_register_command(hass, ws_get_knx_project) if DOMAIN not in hass.data.get("frontend_panels", {}): hass.http.register_static_path( @@ -67,6 +68,7 @@ def ws_info( "name": project_info["name"], "last_modified": project_info["last_modified"], "tool_version": project_info["tool_version"], + "xknxproject_version": project_info["xknxproject_version"], } connection.send_result( @@ -80,6 +82,30 @@ def ws_info( ) +@websocket_api.require_admin +@websocket_api.websocket_command( + { + vol.Required("type"): "knx/get_knx_project", + } +) +@websocket_api.async_response +async def ws_get_knx_project( + hass: HomeAssistant, + connection: websocket_api.ActiveConnection, + msg: dict, +) -> None: + """Handle get KNX project.""" + knx: KNXModule = hass.data[DOMAIN] + knxproject = await knx.project.get_knxproject() + connection.send_result( + msg["id"], + { + "project_loaded": knx.project.loaded, + "knxproject": knxproject, + }, + ) + + @websocket_api.require_admin @websocket_api.websocket_command( { diff --git a/tests/components/knx/test_websocket.py b/tests/components/knx/test_websocket.py index 76a9544552f..5e5d46af4a6 100644 --- a/tests/components/knx/test_websocket.py +++ b/tests/components/knx/test_websocket.py @@ -138,6 +138,24 @@ async def test_knx_project_file_remove( assert not hass.data[DOMAIN].project.loaded +async def test_knx_get_project( + hass: HomeAssistant, + knx: KNXTestKit, + hass_ws_client: WebSocketGenerator, + load_knxproj: None, +): + """Test retrieval of kxnproject from store.""" + await knx.setup_integration({}) + client = await hass_ws_client(hass) + assert hass.data[DOMAIN].project.loaded + + await client.send_json({"id": 3, "type": "knx/get_knx_project"}) + res = await client.receive_json() + assert res["success"], res + assert res["result"]["project_loaded"] is True + assert res["result"]["knxproject"] == FIXTURE_PROJECT_DATA + + async def test_knx_group_monitor_info_command( hass: HomeAssistant, knx: KNXTestKit, hass_ws_client: WebSocketGenerator ):