diff --git a/homeassistant/components/knx/__init__.py b/homeassistant/components/knx/__init__.py index 2ca37cc39eb..a486582daec 100644 --- a/homeassistant/components/knx/__init__.py +++ b/homeassistant/components/knx/__init__.py @@ -362,11 +362,8 @@ class KNXModule: def init_xknx(self) -> None: """Initialize XKNX object.""" self.xknx = XKNX( - own_address=self.entry.data[CONF_KNX_INDIVIDUAL_ADDRESS], - rate_limit=self.entry.data[CONF_KNX_RATE_LIMIT], - multicast_group=self.entry.data[CONF_KNX_MCAST_GRP], - multicast_port=self.entry.data[CONF_KNX_MCAST_PORT], connection_config=self.connection_config(), + rate_limit=self.entry.data[CONF_KNX_RATE_LIMIT], state_updater=self.entry.data[CONF_KNX_STATE_UPDATER], ) @@ -384,6 +381,9 @@ class KNXModule: if _conn_type == CONF_KNX_ROUTING: return ConnectionConfig( connection_type=ConnectionType.ROUTING, + individual_address=self.entry.data[CONF_KNX_INDIVIDUAL_ADDRESS], + multicast_group=self.entry.data[CONF_KNX_MCAST_GRP], + multicast_port=self.entry.data[CONF_KNX_MCAST_PORT], local_ip=self.entry.data.get(CONF_KNX_LOCAL_IP), auto_reconnect=True, threaded=True, diff --git a/homeassistant/components/knx/config_flow.py b/homeassistant/components/knx/config_flow.py index 3d046ecaeec..c4107ed7e8b 100644 --- a/homeassistant/components/knx/config_flow.py +++ b/homeassistant/components/knx/config_flow.py @@ -6,10 +6,10 @@ from typing import Any, Final import voluptuous as vol from xknx import XKNX -from xknx.exceptions.exception import InvalidSignature +from xknx.exceptions.exception import InvalidSecureConfiguration from xknx.io import DEFAULT_MCAST_GRP, DEFAULT_MCAST_PORT from xknx.io.gateway_scanner import GatewayDescriptor, GatewayScanner -from xknx.secure import load_key_ring +from xknx.secure import load_keyring from homeassistant.config_entries import ConfigEntry, ConfigFlow, OptionsFlow from homeassistant.const import CONF_HOST, CONF_PORT @@ -41,6 +41,7 @@ from .const import ( CONF_KNX_TUNNELING_TCP, CONF_KNX_TUNNELING_TCP_SECURE, CONST_KNX_STORAGE_KEY, + DEFAULT_ROUTING_IA, DOMAIN, KNXConfigEntryData, ) @@ -50,7 +51,7 @@ CONF_KNX_GATEWAY: Final = "gateway" CONF_MAX_RATE_LIMIT: Final = 60 DEFAULT_ENTRY_DATA = KNXConfigEntryData( - individual_address=XKNX.DEFAULT_ADDRESS, + individual_address=DEFAULT_ROUTING_IA, local_ip=None, multicast_group=DEFAULT_MCAST_GRP, multicast_port=DEFAULT_MCAST_PORT, @@ -347,13 +348,13 @@ class KNXCommonFlow(ABC, FlowHandler): assert self._tunneling_config storage_key = CONST_KNX_STORAGE_KEY + user_input[CONF_KNX_KNXKEY_FILENAME] try: - load_key_ring( + await load_keyring( path=self.hass.config.path(STORAGE_DIR, storage_key), password=user_input[CONF_KNX_KNXKEY_PASSWORD], ) except FileNotFoundError: errors[CONF_KNX_KNXKEY_FILENAME] = "file_not_found" - except InvalidSignature: + except InvalidSecureConfiguration: errors[CONF_KNX_KNXKEY_PASSWORD] = "invalid_signature" if not errors: diff --git a/homeassistant/components/knx/const.py b/homeassistant/components/knx/const.py index 3cc73a6dd35..a6a88b2010a 100644 --- a/homeassistant/components/knx/const.py +++ b/homeassistant/components/knx/const.py @@ -41,7 +41,9 @@ CONF_KNX_RATE_LIMIT: Final = "rate_limit" CONF_KNX_ROUTE_BACK: Final = "route_back" CONF_KNX_STATE_UPDATER: Final = "state_updater" CONF_KNX_DEFAULT_STATE_UPDATER: Final = True -CONF_KNX_DEFAULT_RATE_LIMIT: Final = 20 +CONF_KNX_DEFAULT_RATE_LIMIT: Final = 0 + +DEFAULT_ROUTING_IA: Final = "0.0.240" ## # Secure constants diff --git a/homeassistant/components/knx/manifest.json b/homeassistant/components/knx/manifest.json index a7436ef1ae3..da0753a9220 100644 --- a/homeassistant/components/knx/manifest.json +++ b/homeassistant/components/knx/manifest.json @@ -3,7 +3,7 @@ "name": "KNX", "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/knx", - "requirements": ["xknx==1.2.1"], + "requirements": ["xknx==2.0.0"], "codeowners": ["@Julius2342", "@farmio", "@marvin-w"], "quality_scale": "platinum", "iot_class": "local_push", diff --git a/requirements_all.txt b/requirements_all.txt index e844738a1ab..dfa74930521 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -2580,7 +2580,7 @@ xboxapi==2.0.1 xiaomi-ble==0.12.2 # homeassistant.components.knx -xknx==1.2.1 +xknx==2.0.0 # homeassistant.components.bluesound # homeassistant.components.fritz diff --git a/requirements_test_all.txt b/requirements_test_all.txt index 6eae3f35265..32592f4d9f6 100644 --- a/requirements_test_all.txt +++ b/requirements_test_all.txt @@ -1793,7 +1793,7 @@ xbox-webapi==2.0.11 xiaomi-ble==0.12.2 # homeassistant.components.knx -xknx==1.2.1 +xknx==2.0.0 # homeassistant.components.bluesound # homeassistant.components.fritz diff --git a/tests/components/knx/conftest.py b/tests/components/knx/conftest.py index 23e04b672ba..b6735df3624 100644 --- a/tests/components/knx/conftest.py +++ b/tests/components/knx/conftest.py @@ -23,6 +23,7 @@ from homeassistant.components.knx.const import ( CONF_KNX_MCAST_PORT, CONF_KNX_RATE_LIMIT, CONF_KNX_STATE_UPDATER, + DEFAULT_ROUTING_IA, DOMAIN as KNX_DOMAIN, ) from homeassistant.core import HomeAssistant @@ -224,7 +225,7 @@ def mock_config_entry() -> MockConfigEntry: CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, }, ) diff --git a/tests/components/knx/test_config_flow.py b/tests/components/knx/test_config_flow.py index fdef15ed217..d57007ed28b 100644 --- a/tests/components/knx/test_config_flow.py +++ b/tests/components/knx/test_config_flow.py @@ -2,7 +2,7 @@ from unittest.mock import patch import pytest -from xknx.exceptions.exception import InvalidSignature +from xknx.exceptions.exception import InvalidSecureConfiguration from xknx.io import DEFAULT_MCAST_GRP, DEFAULT_MCAST_PORT from xknx.io.gateway_scanner import GatewayDescriptor @@ -212,7 +212,7 @@ async def test_routing_setup_advanced(hass: HomeAssistant) -> None: CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING, CONF_HOST: "192.168.0.1", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: False, CONF_KNX_LOCAL_IP: None, }, @@ -229,7 +229,7 @@ async def test_routing_setup_advanced(hass: HomeAssistant) -> None: CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING_TCP, CONF_HOST: "192.168.0.1", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: False, CONF_KNX_LOCAL_IP: None, }, @@ -246,7 +246,7 @@ async def test_routing_setup_advanced(hass: HomeAssistant) -> None: CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING, CONF_HOST: "192.168.0.1", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: True, CONF_KNX_LOCAL_IP: None, }, @@ -374,7 +374,7 @@ async def test_tunneling_setup_for_local_ip(hass: HomeAssistant) -> None: CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING, CONF_HOST: "192.168.0.2", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: False, CONF_KNX_LOCAL_IP: "192.168.1.112", } @@ -420,7 +420,7 @@ async def test_tunneling_setup_for_multiple_found_gateways(hass: HomeAssistant) CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING, CONF_HOST: "192.168.0.1", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: False, CONF_KNX_LOCAL_IP: None, } @@ -625,7 +625,7 @@ async def test_configure_secure_tunnel_manual(hass: HomeAssistant): CONF_KNX_SECURE_DEVICE_AUTHENTICATION: "device_auth", CONF_HOST: "192.168.0.1", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: False, CONF_KNX_LOCAL_IP: None, } @@ -649,7 +649,7 @@ async def test_configure_secure_knxkeys(hass: HomeAssistant): "homeassistant.components.knx.async_setup_entry", return_value=True, ) as mock_setup_entry, patch( - "homeassistant.components.knx.config_flow.load_key_ring", return_value=True + "homeassistant.components.knx.config_flow.load_keyring", return_value=True ): secure_knxkeys = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -667,7 +667,7 @@ async def test_configure_secure_knxkeys(hass: HomeAssistant): CONF_KNX_KNXKEY_PASSWORD: "password", CONF_HOST: "192.168.0.1", CONF_PORT: 3675, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_KNX_ROUTE_BACK: False, CONF_KNX_LOCAL_IP: None, } @@ -688,7 +688,7 @@ async def test_configure_secure_knxkeys_file_not_found(hass: HomeAssistant): assert not result["errors"] with patch( - "homeassistant.components.knx.config_flow.load_key_ring", + "homeassistant.components.knx.config_flow.load_keyring", side_effect=FileNotFoundError(), ): secure_knxkeys = await hass.config_entries.flow.async_configure( @@ -717,8 +717,8 @@ async def test_configure_secure_knxkeys_invalid_signature(hass: HomeAssistant): assert not result["errors"] with patch( - "homeassistant.components.knx.config_flow.load_key_ring", - side_effect=InvalidSignature(), + "homeassistant.components.knx.config_flow.load_keyring", + side_effect=InvalidSecureConfiguration(), ): secure_knxkeys = await hass.config_entries.flow.async_configure( result["flow_id"], @@ -773,13 +773,13 @@ async def test_options_flow_connection_type( assert mock_config_entry.data == { CONF_KNX_CONNECTION_TYPE: CONF_KNX_TUNNELING, - CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250", + CONF_KNX_INDIVIDUAL_ADDRESS: "0.0.240", CONF_HOST: "192.168.0.1", CONF_PORT: 3675, CONF_KNX_LOCAL_IP: None, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_RATE_LIMIT: 20, + CONF_KNX_RATE_LIMIT: 0, CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_ROUTE_BACK: False, } @@ -804,7 +804,7 @@ async def test_options_communication_settings( result["flow_id"], user_input={ CONF_KNX_STATE_UPDATER: False, - CONF_KNX_RATE_LIMIT: 0, + CONF_KNX_RATE_LIMIT: 40, }, ) @@ -816,5 +816,5 @@ async def test_options_communication_settings( **DEFAULT_ENTRY_DATA, CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC, CONF_KNX_STATE_UPDATER: False, - CONF_KNX_RATE_LIMIT: 0, + CONF_KNX_RATE_LIMIT: 40, } diff --git a/tests/components/knx/test_diagnostic.py b/tests/components/knx/test_diagnostic.py index 5f4dd01bcb6..f40649ee1eb 100644 --- a/tests/components/knx/test_diagnostic.py +++ b/tests/components/knx/test_diagnostic.py @@ -2,7 +2,6 @@ from unittest.mock import patch from aiohttp import ClientSession -from xknx import XKNX from xknx.io import DEFAULT_MCAST_GRP, DEFAULT_MCAST_PORT from homeassistant.components.knx.const import ( @@ -18,6 +17,7 @@ from homeassistant.components.knx.const import ( CONF_KNX_SECURE_DEVICE_AUTHENTICATION, CONF_KNX_SECURE_USER_PASSWORD, CONF_KNX_STATE_UPDATER, + DEFAULT_ROUTING_IA, DOMAIN as KNX_DOMAIN, ) from homeassistant.core import HomeAssistant @@ -45,10 +45,10 @@ async def test_diagnostics( ) == { "config_entry_data": { "connection_type": "automatic", - "individual_address": "15.15.250", + "individual_address": "0.0.240", "multicast_group": "224.0.23.12", "multicast_port": 3671, - "rate_limit": 20, + "rate_limit": 0, "state_updater": True, }, "configuration_error": None, @@ -77,10 +77,10 @@ async def test_diagnostic_config_error( ) == { "config_entry_data": { "connection_type": "automatic", - "individual_address": "15.15.250", + "individual_address": "0.0.240", "multicast_group": "224.0.23.12", "multicast_port": 3671, - "rate_limit": 20, + "rate_limit": 0, "state_updater": True, }, "configuration_error": "extra keys not allowed @ data['knx']['wrong_key']", @@ -103,7 +103,7 @@ async def test_diagnostic_redact( CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, CONF_KNX_KNXKEY_PASSWORD: "password", CONF_KNX_SECURE_USER_PASSWORD: "user_password", CONF_KNX_SECURE_DEVICE_AUTHENTICATION: "device_authentication", @@ -120,10 +120,10 @@ async def test_diagnostic_redact( ) == { "config_entry_data": { "connection_type": "automatic", - "individual_address": "15.15.250", + "individual_address": "0.0.240", "multicast_group": "224.0.23.12", "multicast_port": 3671, - "rate_limit": 20, + "rate_limit": 0, "state_updater": True, "knxkeys_password": "**REDACTED**", "user_password": "**REDACTED**", diff --git a/tests/components/knx/test_init.py b/tests/components/knx/test_init.py index 82ddf73f1ea..4bda407ace7 100644 --- a/tests/components/knx/test_init.py +++ b/tests/components/knx/test_init.py @@ -1,6 +1,5 @@ """Test KNX init.""" import pytest -from xknx import XKNX from xknx.io import ( DEFAULT_MCAST_GRP, DEFAULT_MCAST_PORT, @@ -9,6 +8,7 @@ from xknx.io import ( SecureConfig, ) +from homeassistant.components.knx.config_flow import DEFAULT_ROUTING_IA from homeassistant.components.knx.const import ( CONF_KNX_AUTOMATIC, CONF_KNX_CONNECTION_TYPE, @@ -51,7 +51,7 @@ from tests.common import MockConfigEntry CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, }, ConnectionConfig(threaded=True), ), @@ -63,10 +63,13 @@ from tests.common import MockConfigEntry CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, }, ConnectionConfig( connection_type=ConnectionType.ROUTING, + individual_address=DEFAULT_ROUTING_IA, + multicast_group=DEFAULT_MCAST_GRP, + multicast_port=DEFAULT_MCAST_PORT, local_ip="192.168.1.1", threaded=True, ), @@ -82,7 +85,7 @@ from tests.common import MockConfigEntry CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, }, ConnectionConfig( connection_type=ConnectionType.TUNNELING, @@ -103,7 +106,7 @@ from tests.common import MockConfigEntry CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, }, ConnectionConfig( connection_type=ConnectionType.TUNNELING_TCP, @@ -122,7 +125,7 @@ from tests.common import MockConfigEntry CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, CONF_KNX_KNXKEY_FILENAME: "knx/testcase.knxkeys", CONF_KNX_KNXKEY_PASSWORD: "password", }, @@ -146,7 +149,7 @@ from tests.common import MockConfigEntry CONF_KNX_STATE_UPDATER: CONF_KNX_DEFAULT_STATE_UPDATER, CONF_KNX_MCAST_PORT: DEFAULT_MCAST_PORT, CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, - CONF_KNX_INDIVIDUAL_ADDRESS: XKNX.DEFAULT_ADDRESS, + CONF_KNX_INDIVIDUAL_ADDRESS: DEFAULT_ROUTING_IA, CONF_KNX_SECURE_USER_ID: 2, CONF_KNX_SECURE_USER_PASSWORD: "password", CONF_KNX_SECURE_DEVICE_AUTHENTICATION: "device_auth",