Raise UnsupportedDeviceError instead of crashing on unknown device types (#1781)

Use get() instead of index accessor to avoid crashing on unknown devices.

---------

Co-authored-by: GhostCoder6969 <ghostcoder6969@gmail.com>
This commit is contained in:
GhostCoder6969
2026-10-12 23:31:01 +02:00
committed by GitHub
parent 38a3184de6
commit a4fe376c54
2 changed files with 29 additions and 1 deletions

View File

@@ -142,7 +142,13 @@ def get_device_class_from_sys_info(sysinfo: dict[str, Any]) -> type[IotDevice]:
# Disabled until properly implemented # Disabled until properly implemented
# DeviceType.Camera: IotCamera, # DeviceType.Camera: IotCamera,
} }
return TYPE_TO_CLASS[IotDevice._get_device_type_from_sys_info(sysinfo)] device_type = IotDevice._get_device_type_from_sys_info(sysinfo)
if (cls := TYPE_TO_CLASS.get(device_type)) is None:
raise UnsupportedDeviceError(
f"Unsupported device type: {device_type}",
discovery_result=sysinfo,
)
return cls
def get_device_class_from_family( def get_device_class_from_family(

View File

@@ -21,6 +21,7 @@ from kasa import (
KasaException, KasaException,
SmartCamProtocol, SmartCamProtocol,
SmartProtocol, SmartProtocol,
UnsupportedDeviceError,
) )
from kasa.device_factory import ( from kasa.device_factory import (
Device, Device,
@@ -31,6 +32,7 @@ from kasa.device_factory import (
SmartDevice, SmartDevice,
connect, connect,
get_device_class_from_family, get_device_class_from_family,
get_device_class_from_sys_info,
get_protocol, get_protocol,
) )
from kasa.deviceconfig import ( from kasa.deviceconfig import (
@@ -212,6 +214,26 @@ async def test_device_types(dev: Device) -> None:
assert dev.device_type == res assert dev.device_type == res
def test_device_class_from_unsupported_legacy_camera() -> None:
"""IOT.IPCAMERA sysinfo raises UnsupportedDeviceError instead of KeyError."""
info = {
"system": {
"get_sysinfo": {
"system": {
"type": "IOT.IPCAMERA",
"model": "EC60(US)",
"alias": "Kasa Cam",
"dev_name": "Kasa Spot",
}
}
}
}
with pytest.raises(UnsupportedDeviceError, match="Unsupported device type"):
get_device_class_from_sys_info(info)
with pytest.raises(UnsupportedDeviceError, match="Unsupported device type"):
Discover._get_device_class(info)
@pytest.mark.xdist_group(name="caplog") @pytest.mark.xdist_group(name="caplog")
async def test_device_class_from_unknown_family( async def test_device_class_from_unknown_family(
caplog: pytest.LogCaptureFixture, caplog: pytest.LogCaptureFixture,