mirror of
https://github.com/python-kasa/python-kasa.git
synced 2025-08-09 20:24:02 +00:00
Move TAPO smartcamera out of experimental package (#1255)
Co-authored-by: Teemu R. <tpr@iki.fi>
This commit is contained in:
@@ -11,9 +11,9 @@ from kasa import (
|
||||
DeviceType,
|
||||
Discover,
|
||||
)
|
||||
from kasa.experimental.smartcamera import SmartCamera
|
||||
from kasa.iot import IotBulb, IotDimmer, IotLightStrip, IotPlug, IotStrip, IotWallSwitch
|
||||
from kasa.smart import SmartDevice
|
||||
from kasa.smartcamera.smartcamera import SmartCamera
|
||||
|
||||
from .fakeprotocol_iot import FakeIotProtocol
|
||||
from .fakeprotocol_smart import FakeSmartProtocol
|
||||
|
@@ -10,6 +10,7 @@ from kasa.transports.xortransport import XorEncryption
|
||||
|
||||
from .fakeprotocol_iot import FakeIotProtocol
|
||||
from .fakeprotocol_smart import FakeSmartProtocol, FakeSmartTransport
|
||||
from .fakeprotocol_smartcamera import FakeSmartCameraProtocol
|
||||
from .fixtureinfo import FixtureInfo, filter_fixtures, idgenerator
|
||||
|
||||
DISCOVERY_MOCK_IP = "127.0.0.123"
|
||||
@@ -126,12 +127,14 @@ def create_discovery_mock(ip: str, fixture_data: dict):
|
||||
|
||||
if "discovery_result" in fixture_data:
|
||||
discovery_data = {"result": fixture_data["discovery_result"].copy()}
|
||||
device_type = fixture_data["discovery_result"]["device_type"]
|
||||
encrypt_type = fixture_data["discovery_result"]["mgt_encrypt_schm"][
|
||||
"encrypt_type"
|
||||
]
|
||||
login_version = fixture_data["discovery_result"]["mgt_encrypt_schm"].get("lv")
|
||||
https = fixture_data["discovery_result"]["mgt_encrypt_schm"]["is_support_https"]
|
||||
discovery_result = fixture_data["discovery_result"]
|
||||
device_type = discovery_result["device_type"]
|
||||
encrypt_type = discovery_result["mgt_encrypt_schm"].get(
|
||||
"encrypt_type", discovery_result.get("encrypt_info", {}).get("sym_schm")
|
||||
)
|
||||
|
||||
login_version = discovery_result["mgt_encrypt_schm"].get("lv")
|
||||
https = discovery_result["mgt_encrypt_schm"]["is_support_https"]
|
||||
dm = _DiscoveryMock(
|
||||
ip,
|
||||
80,
|
||||
@@ -172,7 +175,9 @@ def patch_discovery(fixture_infos: dict[str, FixtureInfo], mocker):
|
||||
}
|
||||
protos = {
|
||||
ip: FakeSmartProtocol(fixture_info.data, fixture_info.name)
|
||||
if "SMART" in fixture_info.protocol
|
||||
if fixture_info.protocol in {"SMART", "SMART.CHILD"}
|
||||
else FakeSmartCameraProtocol(fixture_info.data, fixture_info.name)
|
||||
if fixture_info.protocol in {"SMARTCAMERA", "SMARTCAMERA.CHILD"}
|
||||
else FakeIotProtocol(fixture_info.data, fixture_info.name)
|
||||
for ip, fixture_info in fixture_infos.items()
|
||||
}
|
||||
@@ -197,7 +202,9 @@ def patch_discovery(fixture_infos: dict[str, FixtureInfo], mocker):
|
||||
# update the protos for any host testing or the test overriding the first ip
|
||||
protos[host] = (
|
||||
FakeSmartProtocol(fixture_info.data, fixture_info.name)
|
||||
if "SMART" in fixture_info.protocol
|
||||
if fixture_info.protocol in {"SMART", "SMART.CHILD"}
|
||||
else FakeSmartCameraProtocol(fixture_info.data, fixture_info.name)
|
||||
if fixture_info.protocol in {"SMARTCAMERA", "SMARTCAMERA.CHILD"}
|
||||
else FakeIotProtocol(fixture_info.data, fixture_info.name)
|
||||
)
|
||||
port = (
|
||||
|
@@ -4,7 +4,7 @@ import copy
|
||||
from json import loads as json_loads
|
||||
|
||||
from kasa import Credentials, DeviceConfig, SmartProtocol
|
||||
from kasa.experimental.smartcameraprotocol import SmartCameraProtocol
|
||||
from kasa.protocols.smartcameraprotocol import SmartCameraProtocol
|
||||
from kasa.transports.basetransport import BaseTransport
|
||||
|
||||
from .fakeprotocol_smart import FakeSmartTransport
|
||||
@@ -136,6 +136,12 @@ class FakeSmartCameraTransport(BaseTransport):
|
||||
"basic",
|
||||
"zone_id",
|
||||
],
|
||||
("led", "config", "enabled"): [
|
||||
"getLedStatus",
|
||||
"led",
|
||||
"config",
|
||||
"enabled",
|
||||
],
|
||||
}
|
||||
|
||||
async def _send_request(self, request_dict: dict):
|
||||
|
@@ -8,8 +8,8 @@ from typing import Iterable, NamedTuple
|
||||
|
||||
from kasa.device_factory import _get_device_type_from_sys_info
|
||||
from kasa.device_type import DeviceType
|
||||
from kasa.experimental.smartcamera import SmartCamera
|
||||
from kasa.smart.smartdevice import SmartDevice
|
||||
from kasa.smartcamera.smartcamera import SmartCamera
|
||||
|
||||
|
||||
class FixtureInfo(NamedTuple):
|
||||
@@ -179,7 +179,7 @@ def filter_fixtures(
|
||||
|
||||
filtered = []
|
||||
if protocol_filter is None:
|
||||
protocol_filter = {"IOT", "SMART"}
|
||||
protocol_filter = {"IOT", "SMART", "SMARTCAMERA"}
|
||||
for fixture_data in fixture_list:
|
||||
if data_root_filter and data_root_filter not in fixture_data.data:
|
||||
continue
|
||||
|
@@ -43,6 +43,7 @@ from kasa.cli.wifi import wifi
|
||||
from kasa.discover import Discover, DiscoveryResult
|
||||
from kasa.iot import IotDevice
|
||||
from kasa.smart import SmartDevice
|
||||
from kasa.smartcamera import SmartCamera
|
||||
|
||||
from .conftest import (
|
||||
device_smart,
|
||||
@@ -178,6 +179,9 @@ async def test_state(dev, turn_on, runner):
|
||||
|
||||
@turn_on
|
||||
async def test_toggle(dev, turn_on, runner):
|
||||
if isinstance(dev, SmartCamera) and dev.device_type == DeviceType.Hub:
|
||||
pytest.skip(reason="Hub cannot toggle state")
|
||||
|
||||
await handle_turn_on(dev, turn_on)
|
||||
await dev.update()
|
||||
assert dev.is_on == turn_on
|
||||
@@ -208,7 +212,9 @@ async def test_raw_command(dev, mocker, runner):
|
||||
update = mocker.patch.object(dev, "update")
|
||||
from kasa.smart import SmartDevice
|
||||
|
||||
if isinstance(dev, SmartDevice):
|
||||
if isinstance(dev, SmartCamera):
|
||||
params = ["na", "getDeviceInfo"]
|
||||
elif isinstance(dev, SmartDevice):
|
||||
params = ["na", "get_device_info"]
|
||||
else:
|
||||
params = ["system", "get_sysinfo"]
|
||||
|
@@ -19,6 +19,7 @@ from kasa import (
|
||||
)
|
||||
from kasa.device_factory import (
|
||||
Device,
|
||||
SmartCamera,
|
||||
SmartDevice,
|
||||
_get_device_type_from_sys_info,
|
||||
connect,
|
||||
@@ -177,7 +178,9 @@ async def test_connect_http_client(discovery_mock, mocker):
|
||||
|
||||
async def test_device_types(dev: Device):
|
||||
await dev.update()
|
||||
if isinstance(dev, SmartDevice):
|
||||
if isinstance(dev, SmartCamera):
|
||||
res = SmartCamera._get_device_type_from_sysinfo(dev.sys_info)
|
||||
elif isinstance(dev, SmartDevice):
|
||||
assert dev._discovery_info
|
||||
device_type = cast(str, dev._discovery_info["result"]["device_type"])
|
||||
res = SmartDevice._get_device_type_from_components(
|
||||
|
@@ -18,13 +18,13 @@ from kasa.exceptions import (
|
||||
KasaException,
|
||||
SmartErrorCode,
|
||||
)
|
||||
from kasa.experimental.sslaestransport import (
|
||||
from kasa.httpclient import HttpClient
|
||||
from kasa.transports.aestransport import AesEncyptionSession
|
||||
from kasa.transports.sslaestransport import (
|
||||
SslAesTransport,
|
||||
TransportState,
|
||||
_sha256_hash,
|
||||
)
|
||||
from kasa.httpclient import HttpClient
|
||||
from kasa.transports.aestransport import AesEncyptionSession
|
||||
|
||||
# Transport tests are not designed for real devices
|
||||
pytestmark = [pytest.mark.requires_dummy]
|
||||
|
Reference in New Issue
Block a user