Fix configuration_url
for Shelly device using IPv6 (#121939)
Co-authored-by: Maciej Bieniek <478555+bieniu@users.noreply.github.com>
This commit is contained in:
parent
9f53d0ccd9
commit
50751574b4
3 changed files with 34 additions and 2 deletions
|
@ -61,6 +61,7 @@ from .utils import (
|
|||
async_create_issue_unsupported_firmware,
|
||||
get_block_device_sleep_period,
|
||||
get_device_entry_gen,
|
||||
get_host,
|
||||
get_http_port,
|
||||
get_rpc_device_wakeup_period,
|
||||
update_device_fw_info,
|
||||
|
@ -147,7 +148,7 @@ class ShellyCoordinatorBase[_DeviceT: BlockDevice | RpcDevice](
|
|||
model=MODEL_NAMES.get(self.model, self.model),
|
||||
sw_version=self.sw_version,
|
||||
hw_version=f"gen{get_device_entry_gen(self.entry)} ({self.model})",
|
||||
configuration_url=f"http://{self.entry.data[CONF_HOST]}:{get_http_port(self.entry.data)}",
|
||||
configuration_url=f"http://{get_host(self.entry.data[CONF_HOST])}:{get_http_port(self.entry.data)}",
|
||||
)
|
||||
self.device_id = device_entry.id
|
||||
|
||||
|
|
|
@ -3,7 +3,7 @@
|
|||
from __future__ import annotations
|
||||
|
||||
from datetime import datetime, timedelta
|
||||
from ipaddress import IPv4Address
|
||||
from ipaddress import IPv4Address, IPv6Address, ip_address
|
||||
import re
|
||||
from types import MappingProxyType
|
||||
from typing import Any, cast
|
||||
|
@ -486,6 +486,20 @@ def get_http_port(data: MappingProxyType[str, Any]) -> int:
|
|||
return cast(int, data.get(CONF_PORT, DEFAULT_HTTP_PORT))
|
||||
|
||||
|
||||
def get_host(host: str) -> str:
|
||||
"""Get the device IP address or hostname."""
|
||||
try:
|
||||
ip_object = ip_address(host)
|
||||
except ValueError:
|
||||
# host contains hostname
|
||||
return host
|
||||
|
||||
if isinstance(ip_object, IPv6Address):
|
||||
return f"[{host}]"
|
||||
|
||||
return host
|
||||
|
||||
|
||||
@callback
|
||||
def async_remove_shelly_rpc_entities(
|
||||
hass: HomeAssistant, domain: str, mac: str, keys: list[str]
|
||||
|
|
|
@ -23,6 +23,7 @@ from homeassistant.components.shelly.utils import (
|
|||
get_block_device_sleep_period,
|
||||
get_block_input_triggers,
|
||||
get_device_uptime,
|
||||
get_host,
|
||||
get_number_of_channels,
|
||||
get_release_url,
|
||||
get_rpc_channel_name,
|
||||
|
@ -274,3 +275,19 @@ def test_get_release_url(
|
|||
result = get_release_url(gen, model, beta)
|
||||
|
||||
assert result is expected
|
||||
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
("host", "expected"),
|
||||
[
|
||||
("shelly_device.local", "shelly_device.local"),
|
||||
("192.168.178.12", "192.168.178.12"),
|
||||
(
|
||||
"2001:0db8:85a3:0000:0000:8a2e:0370:7334",
|
||||
"[2001:0db8:85a3:0000:0000:8a2e:0370:7334]",
|
||||
),
|
||||
],
|
||||
)
|
||||
def test_get_host(host: str, expected: str) -> None:
|
||||
"""Test get_host function."""
|
||||
assert get_host(host) == expected
|
||||
|
|
Loading…
Add table
Reference in a new issue