Use clearer error message for unsupported encryption types (#1831)
Some checks failed
CI / Perform Lint Checks (3.15) (push) Has been cancelled
CI / Python 3.11 on macos-latest (push) Has been cancelled
CI / Python 3.12 on macos-latest (push) Has been cancelled
CI / Python 3.13 on macos-latest (push) Has been cancelled
CI / Python 3.14 on macos-latest (push) Has been cancelled
CI / Python 3.15 on macos-latest (push) Has been cancelled
CI / Python 3.11 on ubuntu-latest (push) Has been cancelled
CI / Python 3.12 on ubuntu-latest (push) Has been cancelled
CI / Python 3.13 on ubuntu-latest (push) Has been cancelled
CI / Python 3.14 on ubuntu-latest (push) Has been cancelled
CI / Python 3.15 on ubuntu-latest (push) Has been cancelled
CI / Python 3.11 on windows-latest (push) Has been cancelled
CI / Python 3.12 on windows-latest (push) Has been cancelled
CI / Python 3.13 on windows-latest (push) Has been cancelled
CI / Python 3.14 on windows-latest (push) Has been cancelled
CI / Python 3.15 on windows-latest (push) Has been cancelled
CodeQL Checks / Analyze (python) (push) Has been cancelled
Stale / stale (push) Has been cancelled

Devices that announce an encryption type the library does not know, such
as `TPAP` used by newer Tapo devices (e.g. RV20 Max Plus), previously
failed with a generic message that dumped the whole encryption scheme:

```
Unsupported device 192.168.xx.xx of type SMART.TAPOROBOVAC with encrypt_scheme EncryptionScheme(is_support_https=True, encrypt_type='TPAP', http_port=4433, lv=2)
```

This can be rather confusing to interpret, as it does not tell what is
not supported (e.g., the device type is definitely supported on non-tpap
transports).
This PR adds a separate check and error message for cases where the
encryption type is not supported, giving this error:
```
Device 192.168.xx.xx (SMART.TAPOROBOVAC) uses unsupported encryption type TPAP
```
This commit is contained in:
Teemu R.
2026-11-04 19:09:38 +01:00
committed by GitHub
parent 0d9bed88a6
commit 693bc4f7ed
2 changed files with 35 additions and 0 deletions

View File

@@ -845,6 +845,14 @@ class Discover:
discovery_result=discovery_result.to_dict(), discovery_result=discovery_result.to_dict(),
host=discovery_result.ip, host=discovery_result.ip,
) )
if encrypt_type not in {e.value for e in DeviceEncryptionType}:
raise UnsupportedDeviceError(
f"Device {discovery_result.ip} ({type_}) uses unsupported "
f"encryption type {encrypt_type}",
discovery_result=discovery_result.to_dict(),
host=discovery_result.ip,
)
return DeviceConnectionParameters.from_values( return DeviceConnectionParameters.from_values(
type_, type_,
encrypt_type, encrypt_type,

View File

@@ -798,3 +798,30 @@ async def test_connection_parameters_from_encrypt_type_list_only():
result["encrypt_type"] = ["9"] result["encrypt_type"] = ["9"]
with pytest.raises(UnsupportedDeviceError, match="no encryption type"): with pytest.raises(UnsupportedDeviceError, match="no encryption type"):
Discover._get_connection_parameters(DiscoveryResult.from_dict(result)) Discover._get_connection_parameters(DiscoveryResult.from_dict(result))
async def test_connection_parameters_unsupported_encrypt_type():
"""An unknown encrypt_type is named in the error."""
result = {
"device_type": "SMART.TAPOROBOVAC",
"device_model": "RV20 Max Plus(EU)",
"device_id": "0000000000000000000000000000000000000000",
"ip": "127.0.0.123",
"mac": "B0-19-21-00-00-00",
"mgt_encrypt_schm": {
"is_support_https": True,
"http_port": 4433,
"encrypt_type": "TPAP",
"lv": 2,
},
}
with pytest.raises(
UnsupportedDeviceError,
match=(
r"^Device 127\.0\.0\.123 \(SMART\.TAPOROBOVAC\) uses unsupported "
r"encryption type TPAP$"
),
) as exc_info:
Discover._get_connection_parameters(DiscoveryResult.from_dict(result))
assert exc_info.value.host == "127.0.0.123"
assert exc_info.value.discovery_result