Fix local_ip handling in KNX options flow (#62969)

pull/63058/head
Marvin Wichmann 2021-12-30 01:13:58 +01:00 committed by GitHub
parent 02e59b2f38
commit b9247f3952
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 79 additions and 32 deletions

View File

@ -28,6 +28,7 @@ from .schema import ConnectionSchema
CONF_KNX_GATEWAY: Final = "gateway" CONF_KNX_GATEWAY: Final = "gateway"
CONF_MAX_RATE_LIMIT: Final = 60 CONF_MAX_RATE_LIMIT: Final = 60
CONF_DEFAULT_LOCAL_IP: Final = "0.0.0.0"
DEFAULT_ENTRY_DATA: Final = { DEFAULT_ENTRY_DATA: Final = {
ConnectionSchema.CONF_KNX_STATE_UPDATER: ConnectionSchema.CONF_KNX_DEFAULT_STATE_UPDATER, ConnectionSchema.CONF_KNX_STATE_UPDATER: ConnectionSchema.CONF_KNX_DEFAULT_STATE_UPDATER,
@ -328,6 +329,12 @@ class KNXOptionsFlowHandler(OptionsFlow):
entry_data = { entry_data = {
**DEFAULT_ENTRY_DATA, **DEFAULT_ENTRY_DATA,
**self.general_settings, **self.general_settings,
ConnectionSchema.CONF_KNX_LOCAL_IP: self.general_settings.get(
ConnectionSchema.CONF_KNX_LOCAL_IP
)
if self.general_settings.get(ConnectionSchema.CONF_KNX_LOCAL_IP)
!= CONF_DEFAULT_LOCAL_IP
else None,
CONF_HOST: self.current_config.get(CONF_HOST, ""), CONF_HOST: self.current_config.get(CONF_HOST, ""),
} }
@ -337,7 +344,7 @@ class KNXOptionsFlowHandler(OptionsFlow):
**user_input, **user_input,
} }
entry_title = entry_data[CONF_KNX_CONNECTION_TYPE].capitalize() entry_title = str(entry_data[CONF_KNX_CONNECTION_TYPE]).capitalize()
if entry_data[CONF_KNX_CONNECTION_TYPE] == CONF_KNX_TUNNELING: if entry_data[CONF_KNX_CONNECTION_TYPE] == CONF_KNX_TUNNELING:
entry_title = f"{CONF_KNX_TUNNELING.capitalize()} @ {entry_data[CONF_HOST]}" entry_title = f"{CONF_KNX_TUNNELING.capitalize()} @ {entry_data[CONF_HOST]}"
@ -388,12 +395,16 @@ class KNXOptionsFlowHandler(OptionsFlow):
} }
if self.show_advanced_options: if self.show_advanced_options:
local_ip = (
self.current_config.get(ConnectionSchema.CONF_KNX_LOCAL_IP)
if self.current_config.get(ConnectionSchema.CONF_KNX_LOCAL_IP)
is not None
else CONF_DEFAULT_LOCAL_IP
)
data_schema[ data_schema[
vol.Optional( vol.Required(
ConnectionSchema.CONF_KNX_LOCAL_IP, ConnectionSchema.CONF_KNX_LOCAL_IP,
default=self.current_config.get( default=local_ip,
ConnectionSchema.CONF_KNX_LOCAL_IP,
),
) )
] = str ] = str
data_schema[ data_schema[

View File

@ -20,7 +20,7 @@
"host": "[%key:common::config_flow::data::host%]", "host": "[%key:common::config_flow::data::host%]",
"individual_address": "Individual address for the connection", "individual_address": "Individual address for the connection",
"route_back": "Route Back / NAT Mode", "route_back": "Route Back / NAT Mode",
"local_ip": "Local IP (leave empty if unsure)" "local_ip": "Local IP of Home Assistant (leave empty for automatic detection)"
} }
}, },
"routing": { "routing": {
@ -29,7 +29,7 @@
"individual_address": "Individual address for the routing connection", "individual_address": "Individual address for the routing connection",
"multicast_group": "The multicast group used for routing", "multicast_group": "The multicast group used for routing",
"multicast_port": "The multicast port used for routing", "multicast_port": "The multicast port used for routing",
"local_ip": "Local IP (leave empty if unsure)" "local_ip": "Local IP of Home Assistant (leave empty for automatic detection)"
} }
} }
}, },
@ -49,7 +49,7 @@
"individual_address": "Default individual address", "individual_address": "Default individual address",
"multicast_group": "Multicast group used for routing and discovery", "multicast_group": "Multicast group used for routing and discovery",
"multicast_port": "Multicast port used for routing and discovery", "multicast_port": "Multicast port used for routing and discovery",
"local_ip": "Local IP (leave empty if unsure)", "local_ip": "Local IP of Home Assistant (use 0.0.0.0 for automatic detection)",
"state_updater": "Globally enable reading states from the KNX Bus", "state_updater": "Globally enable reading states from the KNX Bus",
"rate_limit": "Maximum outgoing telegrams per second" "rate_limit": "Maximum outgoing telegrams per second"
} }

View File

@ -12,7 +12,7 @@
"data": { "data": {
"host": "Host", "host": "Host",
"individual_address": "Individual address for the connection", "individual_address": "Individual address for the connection",
"local_ip": "Local IP (leave empty if unsure)", "local_ip": "Local IP of Home Assistant (leave empty for automatic detection)",
"port": "Port", "port": "Port",
"route_back": "Route Back / NAT Mode" "route_back": "Route Back / NAT Mode"
}, },
@ -21,7 +21,7 @@
"routing": { "routing": {
"data": { "data": {
"individual_address": "Individual address for the routing connection", "individual_address": "Individual address for the routing connection",
"local_ip": "Local IP (leave empty if unsure)", "local_ip": "Local IP of Home Assistant (leave empty for automatic detection)",
"multicast_group": "The multicast group used for routing", "multicast_group": "The multicast group used for routing",
"multicast_port": "The multicast port used for routing" "multicast_port": "The multicast port used for routing"
}, },
@ -47,7 +47,7 @@
"data": { "data": {
"connection_type": "KNX Connection Type", "connection_type": "KNX Connection Type",
"individual_address": "Default individual address", "individual_address": "Default individual address",
"local_ip": "Local IP (leave empty if unsure)", "local_ip": "Local IP of Home Assistant (use 0.0.0.0 for automatic detection)",
"multicast_group": "Multicast group used for routing and discovery", "multicast_group": "Multicast group used for routing and discovery",
"multicast_port": "Multicast port used for routing and discovery", "multicast_port": "Multicast port used for routing and discovery",
"rate_limit": "Maximum outgoing telegrams per second", "rate_limit": "Maximum outgoing telegrams per second",
@ -57,7 +57,6 @@
"tunnel": { "tunnel": {
"data": { "data": {
"host": "Host", "host": "Host",
"local_ip": "Local IP (leave empty if unsure)",
"port": "Port", "port": "Port",
"route_back": "Route Back / NAT Mode" "route_back": "Route Back / NAT Mode"
} }

View File

@ -1,6 +1,7 @@
"""Test the KNX config flow.""" """Test the KNX config flow."""
from unittest.mock import patch from unittest.mock import patch
import pytest
from xknx import XKNX from xknx import XKNX
from xknx.io import DEFAULT_MCAST_GRP from xknx.io import DEFAULT_MCAST_GRP
from xknx.io.gateway_scanner import GatewayDescriptor from xknx.io.gateway_scanner import GatewayDescriptor
@ -8,6 +9,7 @@ from xknx.io.gateway_scanner import GatewayDescriptor
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components.knx import ConnectionSchema from homeassistant.components.knx import ConnectionSchema
from homeassistant.components.knx.config_flow import ( from homeassistant.components.knx.config_flow import (
CONF_DEFAULT_LOCAL_IP,
CONF_KNX_GATEWAY, CONF_KNX_GATEWAY,
DEFAULT_ENTRY_DATA, DEFAULT_ENTRY_DATA,
) )
@ -585,6 +587,7 @@ async def test_options_flow(
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC, CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.255", CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.255",
CONF_HOST: "", CONF_HOST: "",
ConnectionSchema.CONF_KNX_LOCAL_IP: None,
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675, ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 20, ConnectionSchema.CONF_KNX_RATE_LIMIT: 20,
@ -643,14 +646,65 @@ async def test_tunneling_options_flow(
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP, ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 20, ConnectionSchema.CONF_KNX_RATE_LIMIT: 20,
ConnectionSchema.CONF_KNX_STATE_UPDATER: True, ConnectionSchema.CONF_KNX_STATE_UPDATER: True,
ConnectionSchema.CONF_KNX_LOCAL_IP: None,
CONF_HOST: "192.168.1.1", CONF_HOST: "192.168.1.1",
CONF_PORT: 3675, CONF_PORT: 3675,
ConnectionSchema.CONF_KNX_ROUTE_BACK: True, ConnectionSchema.CONF_KNX_ROUTE_BACK: True,
} }
@pytest.mark.parametrize(
"user_input,config_entry_data",
[
(
{
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250",
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 25,
ConnectionSchema.CONF_KNX_STATE_UPDATER: False,
ConnectionSchema.CONF_KNX_LOCAL_IP: "192.168.1.112",
},
{
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250",
CONF_HOST: "",
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 25,
ConnectionSchema.CONF_KNX_STATE_UPDATER: False,
ConnectionSchema.CONF_KNX_LOCAL_IP: "192.168.1.112",
},
),
(
{
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250",
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 25,
ConnectionSchema.CONF_KNX_STATE_UPDATER: False,
ConnectionSchema.CONF_KNX_LOCAL_IP: CONF_DEFAULT_LOCAL_IP,
},
{
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250",
CONF_HOST: "",
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 25,
ConnectionSchema.CONF_KNX_STATE_UPDATER: False,
ConnectionSchema.CONF_KNX_LOCAL_IP: None,
},
),
],
)
async def test_advanced_options( async def test_advanced_options(
hass: HomeAssistant, mock_config_entry: MockConfigEntry hass: HomeAssistant,
mock_config_entry: MockConfigEntry,
user_input,
config_entry_data,
) -> None: ) -> None:
"""Test options config flow.""" """Test options config flow."""
mock_config_entry.add_to_hass(hass) mock_config_entry.add_to_hass(hass)
@ -668,28 +722,11 @@ async def test_advanced_options(
result2 = await hass.config_entries.options.async_configure( result2 = await hass.config_entries.options.async_configure(
result["flow_id"], result["flow_id"],
user_input={ user_input=user_input,
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250",
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 25,
ConnectionSchema.CONF_KNX_STATE_UPDATER: False,
ConnectionSchema.CONF_KNX_LOCAL_IP: "192.168.1.112",
},
) )
await hass.async_block_till_done() await hass.async_block_till_done()
assert result2.get("type") == RESULT_TYPE_CREATE_ENTRY assert result2.get("type") == RESULT_TYPE_CREATE_ENTRY
assert not result2.get("data") assert not result2.get("data")
assert mock_config_entry.data == { assert mock_config_entry.data == config_entry_data
CONF_KNX_CONNECTION_TYPE: CONF_KNX_AUTOMATIC,
CONF_KNX_INDIVIDUAL_ADDRESS: "15.15.250",
CONF_HOST: "",
ConnectionSchema.CONF_KNX_MCAST_PORT: 3675,
ConnectionSchema.CONF_KNX_MCAST_GRP: DEFAULT_MCAST_GRP,
ConnectionSchema.CONF_KNX_RATE_LIMIT: 25,
ConnectionSchema.CONF_KNX_STATE_UPDATER: False,
ConnectionSchema.CONF_KNX_LOCAL_IP: "192.168.1.112",
}