mirror of
https://github.com/python-kasa/python-kasa.git
synced 2024-12-22 11:13:34 +00:00
Update dump_devinfo for raw discovery json and common redactors (#1358)
Some checks failed
CI / Perform linting checks (3.13) (push) Waiting to run
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Blocked by required conditions
CodeQL checks / Analyze (python) (push) Has been cancelled
Some checks failed
CI / Perform linting checks (3.13) (push) Waiting to run
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Blocked by required conditions
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Blocked by required conditions
CodeQL checks / Analyze (python) (push) Has been cancelled
This PR does a few related things to dump_devinfo: - Store the raw discovery result in the fixture. - Consolidate redaction logic so it's not duplicated in dump_devinfo. - Update existing fixtures to: - Store raw discovery result under `result` - Use `SCRUBBED_CHILD_DEVICE_ID` everywhere - Have correct values as per the consolidated redactors.
This commit is contained in:
parent
032cd5d2cc
commit
8cb5c2e180
@ -10,8 +10,6 @@ and finally execute a query to query all of them at once.
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
import base64
|
||||
import collections.abc
|
||||
import dataclasses
|
||||
import json
|
||||
import logging
|
||||
@ -19,6 +17,7 @@ import re
|
||||
import sys
|
||||
import traceback
|
||||
from collections import defaultdict, namedtuple
|
||||
from collections.abc import Callable
|
||||
from pathlib import Path
|
||||
from pprint import pprint
|
||||
from typing import Any
|
||||
@ -39,13 +38,20 @@ from kasa import (
|
||||
)
|
||||
from kasa.device_factory import get_protocol
|
||||
from kasa.deviceconfig import DeviceEncryptionType, DeviceFamily
|
||||
from kasa.discover import DiscoveryResult
|
||||
from kasa.discover import (
|
||||
NEW_DISCOVERY_REDACTORS,
|
||||
DiscoveredRaw,
|
||||
DiscoveryResult,
|
||||
)
|
||||
from kasa.exceptions import SmartErrorCode
|
||||
from kasa.protocols import IotProtocol
|
||||
from kasa.protocols.iotprotocol import REDACTORS as IOT_REDACTORS
|
||||
from kasa.protocols.protocol import redact_data
|
||||
from kasa.protocols.smartcamprotocol import (
|
||||
SmartCamProtocol,
|
||||
_ChildCameraProtocolWrapper,
|
||||
)
|
||||
from kasa.protocols.smartprotocol import REDACTORS as SMART_REDACTORS
|
||||
from kasa.protocols.smartprotocol import SmartProtocol, _ChildProtocolWrapper
|
||||
from kasa.smart import SmartChildDevice, SmartDevice
|
||||
from kasa.smartcam import SmartCamDevice
|
||||
@ -63,6 +69,42 @@ ENCRYPT_TYPES = [encrypt_type.value for encrypt_type in DeviceEncryptionType]
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _wrap_redactors(redactors: dict[str, Callable[[Any], Any] | None]):
|
||||
"""Wrap the redactors for dump_devinfo.
|
||||
|
||||
Will replace all partial REDACT_ values with zeros.
|
||||
If the data item is already scrubbed by dump_devinfo will leave as-is.
|
||||
"""
|
||||
|
||||
def _wrap(key: str) -> Any:
|
||||
def _wrapped(redactor: Callable[[Any], Any] | None) -> Any | None:
|
||||
if redactor is None:
|
||||
return lambda x: "**SCRUBBED**"
|
||||
|
||||
def _redact_to_zeros(x: Any) -> Any:
|
||||
if isinstance(x, str) and "REDACT" in x:
|
||||
return re.sub(r"\w", "0", x)
|
||||
if isinstance(x, dict):
|
||||
for k, v in x.items():
|
||||
x[k] = _redact_to_zeros(v)
|
||||
return x
|
||||
|
||||
def _scrub(x: Any) -> Any:
|
||||
if key in {"ip", "local_ip"}:
|
||||
return "127.0.0.123"
|
||||
# Already scrubbed by dump_devinfo
|
||||
if isinstance(x, str) and "SCRUBBED" in x:
|
||||
return x
|
||||
default = redactor(x)
|
||||
return _redact_to_zeros(default)
|
||||
|
||||
return _scrub
|
||||
|
||||
return _wrapped(redactors[key])
|
||||
|
||||
return {key: _wrap(key) for key in redactors}
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class SmartCall:
|
||||
"""Class for smart and smartcam calls."""
|
||||
@ -74,115 +116,6 @@ class SmartCall:
|
||||
supports_multiple: bool = True
|
||||
|
||||
|
||||
def scrub(res):
|
||||
"""Remove identifiers from the given dict."""
|
||||
keys_to_scrub = [
|
||||
"deviceId",
|
||||
"fwId",
|
||||
"hwId",
|
||||
"oemId",
|
||||
"mac",
|
||||
"mic_mac",
|
||||
"latitude_i",
|
||||
"longitude_i",
|
||||
"latitude",
|
||||
"longitude",
|
||||
"la", # lat on ks240
|
||||
"lo", # lon on ks240
|
||||
"owner",
|
||||
"device_id",
|
||||
"ip",
|
||||
"ssid",
|
||||
"hw_id",
|
||||
"fw_id",
|
||||
"oem_id",
|
||||
"nickname",
|
||||
"alias",
|
||||
"bssid",
|
||||
"channel",
|
||||
"original_device_id", # for child devices on strips
|
||||
"parent_device_id", # for hub children
|
||||
"setup_code", # matter
|
||||
"setup_payload", # matter
|
||||
"mfi_setup_code", # mfi_ for homekit
|
||||
"mfi_setup_id",
|
||||
"mfi_token_token",
|
||||
"mfi_token_uuid",
|
||||
"dev_id",
|
||||
"device_name",
|
||||
"device_alias",
|
||||
"connect_ssid",
|
||||
"encrypt_info",
|
||||
"local_ip",
|
||||
"username",
|
||||
# vacuum
|
||||
"board_sn",
|
||||
"custom_sn",
|
||||
"location",
|
||||
]
|
||||
|
||||
for k, v in res.items():
|
||||
if isinstance(v, collections.abc.Mapping):
|
||||
if k == "encrypt_info":
|
||||
if "data" in v:
|
||||
v["data"] = ""
|
||||
if "key" in v:
|
||||
v["key"] = ""
|
||||
else:
|
||||
res[k] = scrub(res.get(k))
|
||||
elif (
|
||||
isinstance(v, list)
|
||||
and len(v) > 0
|
||||
and isinstance(v[0], collections.abc.Mapping)
|
||||
):
|
||||
res[k] = [scrub(vi) for vi in v]
|
||||
else:
|
||||
if k in keys_to_scrub:
|
||||
if k in ["mac", "mic_mac"]:
|
||||
# Some macs have : or - as a separator and others do not
|
||||
if len(v) == 12:
|
||||
v = f"{v[:6]}000000"
|
||||
else:
|
||||
delim = ":" if ":" in v else "-"
|
||||
rest = delim.join(
|
||||
format(s, "02x") for s in bytes.fromhex("000000")
|
||||
)
|
||||
v = f"{v[:8]}{delim}{rest}"
|
||||
elif k in ["latitude", "latitude_i", "longitude", "longitude_i"]:
|
||||
v = 0
|
||||
elif k in ["ip", "local_ip"]:
|
||||
v = "127.0.0.123"
|
||||
elif k in ["ssid"]:
|
||||
# Need a valid base64 value here
|
||||
v = base64.b64encode(b"#MASKED_SSID#").decode()
|
||||
elif k in ["nickname"]:
|
||||
v = base64.b64encode(b"#MASKED_NAME#").decode()
|
||||
elif k in [
|
||||
"alias",
|
||||
"device_alias",
|
||||
"device_name",
|
||||
"username",
|
||||
"location",
|
||||
]:
|
||||
v = "#MASKED_NAME#"
|
||||
elif isinstance(res[k], int):
|
||||
v = 0
|
||||
elif k in ["map_data"]: #
|
||||
v = "#SCRUBBED_MAPDATA#"
|
||||
elif k in ["device_id", "dev_id"] and "SCRUBBED" in v:
|
||||
pass # already scrubbed
|
||||
elif k == ["device_id", "dev_id"] and len(v) > 40:
|
||||
# retain the last two chars when scrubbing child ids
|
||||
end = v[-2:]
|
||||
v = re.sub(r"\w", "0", v)
|
||||
v = v[:40] + end
|
||||
else:
|
||||
v = re.sub(r"\w", "0", v)
|
||||
|
||||
res[k] = v
|
||||
return res
|
||||
|
||||
|
||||
def default_to_regular(d):
|
||||
"""Convert nested defaultdicts to regular ones.
|
||||
|
||||
@ -209,7 +142,7 @@ async def handle_device(
|
||||
for fixture_result in fixture_results:
|
||||
save_filename = Path(basedir) / fixture_result.folder / fixture_result.filename
|
||||
|
||||
pprint(scrub(fixture_result.data))
|
||||
pprint(fixture_result.data)
|
||||
if autosave:
|
||||
save = "y"
|
||||
else:
|
||||
@ -325,6 +258,11 @@ async def cli(
|
||||
if debug:
|
||||
logging.basicConfig(level=logging.DEBUG)
|
||||
|
||||
raw_discovery = {}
|
||||
|
||||
def capture_raw(discovered: DiscoveredRaw):
|
||||
raw_discovery[discovered["meta"]["ip"]] = discovered["discovery_response"]
|
||||
|
||||
credentials = Credentials(username=username, password=password)
|
||||
if host is not None:
|
||||
if discovery_info:
|
||||
@ -377,12 +315,16 @@ async def cli(
|
||||
credentials=credentials,
|
||||
port=port,
|
||||
discovery_timeout=discovery_timeout,
|
||||
on_discovered_raw=capture_raw,
|
||||
)
|
||||
discovery_info = raw_discovery[device.host]
|
||||
if decrypted_data := device._discovery_info.get("decrypted_data"):
|
||||
discovery_info["decrypted_data"] = decrypted_data
|
||||
await handle_device(
|
||||
basedir,
|
||||
autosave,
|
||||
device.protocol,
|
||||
discovery_info=device._discovery_info,
|
||||
discovery_info=discovery_info,
|
||||
batch_size=batch_size,
|
||||
)
|
||||
else:
|
||||
@ -391,21 +333,28 @@ async def cli(
|
||||
f" {target}. Use --target to override."
|
||||
)
|
||||
devices = await Discover.discover(
|
||||
target=target, credentials=credentials, discovery_timeout=discovery_timeout
|
||||
target=target,
|
||||
credentials=credentials,
|
||||
discovery_timeout=discovery_timeout,
|
||||
on_discovered_raw=capture_raw,
|
||||
)
|
||||
click.echo(f"Detected {len(devices)} devices")
|
||||
for dev in devices.values():
|
||||
discovery_info = raw_discovery[dev.host]
|
||||
if decrypted_data := dev._discovery_info.get("decrypted_data"):
|
||||
discovery_info["decrypted_data"] = decrypted_data
|
||||
|
||||
await handle_device(
|
||||
basedir,
|
||||
autosave,
|
||||
dev.protocol,
|
||||
discovery_info=dev._discovery_info,
|
||||
discovery_info=discovery_info,
|
||||
batch_size=batch_size,
|
||||
)
|
||||
|
||||
|
||||
async def get_legacy_fixture(
|
||||
protocol: IotProtocol, *, discovery_info: dict[str, Any] | None
|
||||
protocol: IotProtocol, *, discovery_info: dict[str, dict[str, Any]] | None
|
||||
) -> FixtureResult:
|
||||
"""Get fixture for legacy IOT style protocol."""
|
||||
items = [
|
||||
@ -475,11 +424,21 @@ async def get_legacy_fixture(
|
||||
_echo_error(f"Unable to query all successes at once: {ex}")
|
||||
finally:
|
||||
await protocol.close()
|
||||
|
||||
final = redact_data(final, _wrap_redactors(IOT_REDACTORS))
|
||||
|
||||
# Scrub the child device ids
|
||||
if children := final.get("system", {}).get("get_sysinfo", {}).get("children"):
|
||||
for index, child in enumerate(children):
|
||||
if "id" not in child:
|
||||
_LOGGER.error("Could not find a device for the child device: %s", child)
|
||||
else:
|
||||
child["id"] = f"SCRUBBED_CHILD_DEVICE_ID_{index + 1}"
|
||||
|
||||
if discovery_info and not discovery_info.get("system"):
|
||||
# Need to recreate a DiscoverResult here because we don't want the aliases
|
||||
# in the fixture, we want the actual field names as returned by the device.
|
||||
dr = DiscoveryResult.from_dict(discovery_info)
|
||||
final["discovery_result"] = dr.to_dict()
|
||||
final["discovery_result"] = redact_data(
|
||||
discovery_info, _wrap_redactors(NEW_DISCOVERY_REDACTORS)
|
||||
)
|
||||
|
||||
click.echo(f"Got {len(successes)} successes")
|
||||
click.echo(click.style("## device info file ##", bold=True))
|
||||
@ -867,7 +826,10 @@ def get_smart_child_fixture(response):
|
||||
|
||||
|
||||
async def get_smart_fixtures(
|
||||
protocol: SmartProtocol, *, discovery_info: dict[str, Any] | None, batch_size: int
|
||||
protocol: SmartProtocol,
|
||||
*,
|
||||
discovery_info: dict[str, dict[str, Any]] | None,
|
||||
batch_size: int,
|
||||
) -> list[FixtureResult]:
|
||||
"""Get fixture for new TAPO style protocol."""
|
||||
if isinstance(protocol, SmartCamProtocol):
|
||||
@ -988,22 +950,24 @@ async def get_smart_fixtures(
|
||||
continue
|
||||
_LOGGER.error("Could not find a device for the child device: %s", child)
|
||||
|
||||
# Need to recreate a DiscoverResult here because we don't want the aliases
|
||||
# in the fixture, we want the actual field names as returned by the device.
|
||||
final = redact_data(final, _wrap_redactors(SMART_REDACTORS))
|
||||
discovery_result = None
|
||||
if discovery_info:
|
||||
dr = DiscoveryResult.from_dict(discovery_info) # type: ignore
|
||||
final["discovery_result"] = dr.to_dict()
|
||||
final["discovery_result"] = redact_data(
|
||||
discovery_info, _wrap_redactors(NEW_DISCOVERY_REDACTORS)
|
||||
)
|
||||
discovery_result = discovery_info["result"]
|
||||
|
||||
click.echo(f"Got {len(successes)} successes")
|
||||
click.echo(click.style("## device info file ##", bold=True))
|
||||
|
||||
if "get_device_info" in final:
|
||||
# smart protocol
|
||||
model_info = SmartDevice._get_device_info(final, discovery_info)
|
||||
model_info = SmartDevice._get_device_info(final, discovery_result)
|
||||
copy_folder = SMART_FOLDER
|
||||
else:
|
||||
# smart camera protocol
|
||||
model_info = SmartCamDevice._get_device_info(final, discovery_info)
|
||||
model_info = SmartCamDevice._get_device_info(final, discovery_result)
|
||||
copy_folder = SMARTCAM_FOLDER
|
||||
hw_version = model_info.hardware_version
|
||||
sw_version = model_info.firmware_version
|
||||
|
@ -205,7 +205,7 @@ def _get_supported_devices(
|
||||
fixture_data = json.load(f)
|
||||
|
||||
model_info = device_cls._get_device_info(
|
||||
fixture_data, fixture_data.get("discovery_result")
|
||||
fixture_data, fixture_data.get("discovery_result", {}).get("result")
|
||||
)
|
||||
|
||||
supported_type = DEVICE_TYPE_TO_PRODUCT_GROUP[model_info.device_type]
|
||||
|
128
devtools/update_fixtures.py
Normal file
128
devtools/update_fixtures.py
Normal file
@ -0,0 +1,128 @@
|
||||
"""Module to mass update fixture files."""
|
||||
|
||||
import json
|
||||
import logging
|
||||
from collections.abc import Callable
|
||||
from pathlib import Path
|
||||
|
||||
import asyncclick as click
|
||||
|
||||
from devtools.dump_devinfo import _wrap_redactors
|
||||
from kasa.discover import NEW_DISCOVERY_REDACTORS, redact_data
|
||||
from kasa.protocols.iotprotocol import REDACTORS as IOT_REDACTORS
|
||||
from kasa.protocols.smartprotocol import REDACTORS as SMART_REDACTORS
|
||||
|
||||
FIXTURE_FOLDER = "tests/fixtures/"
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def update_fixtures(update_func: Callable[[dict], bool], *, dry_run: bool) -> None:
|
||||
"""Run the update function against the fixtures."""
|
||||
for file in Path(FIXTURE_FOLDER).glob("**/*.json"):
|
||||
with file.open("r") as f:
|
||||
fixture_data = json.load(f)
|
||||
|
||||
if file.parent.name == "serialization":
|
||||
continue
|
||||
changed = update_func(fixture_data)
|
||||
if changed:
|
||||
click.echo(f"Will update {file.name}\n")
|
||||
if changed and not dry_run:
|
||||
with file.open("w") as f:
|
||||
json.dump(fixture_data, f, sort_keys=True, indent=4)
|
||||
f.write("\n")
|
||||
|
||||
|
||||
def _discovery_result_update(info) -> bool:
|
||||
"""Update discovery_result to be the raw result and error_code."""
|
||||
if (disco_result := info.get("discovery_result")) and "result" not in disco_result:
|
||||
info["discovery_result"] = {
|
||||
"result": disco_result,
|
||||
"error_code": 0,
|
||||
}
|
||||
return True
|
||||
return False
|
||||
|
||||
|
||||
def _child_device_id_update(info) -> bool:
|
||||
"""Update child device ids to be the scrubbed ids from dump_devinfo."""
|
||||
changed = False
|
||||
if get_child_device_list := info.get("get_child_device_list"):
|
||||
child_device_list = get_child_device_list["child_device_list"]
|
||||
child_component_list = info["get_child_device_component_list"][
|
||||
"child_component_list"
|
||||
]
|
||||
for index, child_device in enumerate(child_device_list):
|
||||
child_component = child_component_list[index]
|
||||
if "SCRUBBED" not in child_device["device_id"]:
|
||||
dev_id = f"SCRUBBED_CHILD_DEVICE_ID_{index + 1}"
|
||||
click.echo(
|
||||
f"child_device_id{index}: {child_device['device_id']} -> {dev_id}"
|
||||
)
|
||||
child_device["device_id"] = dev_id
|
||||
child_component["device_id"] = dev_id
|
||||
changed = True
|
||||
|
||||
if children := info.get("system", {}).get("get_sysinfo", {}).get("children"):
|
||||
for index, child_device in enumerate(children):
|
||||
if "SCRUBBED" not in child_device["id"]:
|
||||
dev_id = f"SCRUBBED_CHILD_DEVICE_ID_{index + 1}"
|
||||
click.echo(f"child_device_id{index}: {child_device['id']} -> {dev_id}")
|
||||
child_device["id"] = dev_id
|
||||
changed = True
|
||||
|
||||
return changed
|
||||
|
||||
|
||||
def _diff_data(fullkey, data1, data2, diffs):
|
||||
if isinstance(data1, dict):
|
||||
for k, v in data1.items():
|
||||
_diff_data(fullkey + "/" + k, v, data2[k], diffs)
|
||||
elif isinstance(data1, list):
|
||||
for index, item in enumerate(data1):
|
||||
_diff_data(fullkey + "/" + str(index), item, data2[index], diffs)
|
||||
elif data1 != data2:
|
||||
diffs[fullkey] = (data1, data2)
|
||||
|
||||
|
||||
def _redactor_result_update(info) -> bool:
|
||||
"""Update fixtures with the output using the common redactors."""
|
||||
changed = False
|
||||
|
||||
redactors = IOT_REDACTORS if "system" in info else SMART_REDACTORS
|
||||
|
||||
for key, val in info.items():
|
||||
if not isinstance(val, dict):
|
||||
continue
|
||||
if key == "discovery_result":
|
||||
info[key] = redact_data(val, _wrap_redactors(NEW_DISCOVERY_REDACTORS))
|
||||
else:
|
||||
info[key] = redact_data(val, _wrap_redactors(redactors))
|
||||
diffs: dict[str, tuple[str, str]] = {}
|
||||
_diff_data(key, val, info[key], diffs)
|
||||
if diffs:
|
||||
for k, v in diffs.items():
|
||||
click.echo(f"{k}: {v[0]} -> {v[1]}")
|
||||
changed = True
|
||||
|
||||
return changed
|
||||
|
||||
|
||||
@click.option(
|
||||
"--dry-run/--no-dry-run",
|
||||
default=False,
|
||||
is_flag=True,
|
||||
type=bool,
|
||||
help="Perform a dry run without saving.",
|
||||
)
|
||||
@click.command()
|
||||
async def cli(dry_run: bool) -> None:
|
||||
"""Cli method fo rupdating fixtures."""
|
||||
update_fixtures(_discovery_result_update, dry_run=dry_run)
|
||||
update_fixtures(_child_device_id_update, dry_run=dry_run)
|
||||
update_fixtures(_redactor_result_update, dry_run=dry_run)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
cli()
|
@ -168,6 +168,12 @@ OnUnsupportedCallable = Callable[[UnsupportedDeviceError], Coroutine]
|
||||
OnConnectAttemptCallable = Callable[[ConnectAttempt, bool], None]
|
||||
DeviceDict = dict[str, Device]
|
||||
|
||||
DECRYPTED_REDACTORS: dict[str, Callable[[Any], Any] | None] = {
|
||||
"connect_ssid": lambda x: "#MASKED_SSID#" if x else "",
|
||||
"device_id": lambda x: "REDACTED_" + x[9::],
|
||||
"owner": lambda x: "REDACTED_" + x[9::],
|
||||
}
|
||||
|
||||
NEW_DISCOVERY_REDACTORS: dict[str, Callable[[Any], Any] | None] = {
|
||||
"device_id": lambda x: "REDACTED_" + x[9::],
|
||||
"device_name": lambda x: "#MASKED_NAME#" if x else "",
|
||||
@ -177,6 +183,8 @@ NEW_DISCOVERY_REDACTORS: dict[str, Callable[[Any], Any] | None] = {
|
||||
"group_id": lambda x: "REDACTED_" + x[9::],
|
||||
"group_name": lambda x: "I01BU0tFRF9TU0lEIw==",
|
||||
"encrypt_info": lambda x: {**x, "key": "", "data": ""},
|
||||
"ip": lambda x: x, # don't redact but keep listed here for dump_devinfo
|
||||
"decrypted_data": lambda x: redact_data(x, DECRYPTED_REDACTORS),
|
||||
}
|
||||
|
||||
|
||||
@ -742,6 +750,7 @@ class Discover:
|
||||
|
||||
@staticmethod
|
||||
def _decrypt_discovery_data(discovery_result: DiscoveryResult) -> None:
|
||||
debug_enabled = _LOGGER.isEnabledFor(logging.DEBUG)
|
||||
if TYPE_CHECKING:
|
||||
assert discovery_result.encrypt_info
|
||||
assert _AesDiscoveryQuery.keypair
|
||||
@ -757,7 +766,19 @@ class Discover:
|
||||
session = AesEncyptionSession(key, iv)
|
||||
decrypted_data = session.decrypt(encrypted_data)
|
||||
|
||||
discovery_result.decrypted_data = json_loads(decrypted_data)
|
||||
result = json_loads(decrypted_data)
|
||||
if debug_enabled:
|
||||
data = (
|
||||
redact_data(result, DECRYPTED_REDACTORS)
|
||||
if Discover._redact_data
|
||||
else result
|
||||
)
|
||||
_LOGGER.debug(
|
||||
"Decrypted encrypt_info for %s: %s",
|
||||
discovery_result.ip,
|
||||
pf(data),
|
||||
)
|
||||
discovery_result.decrypted_data = result
|
||||
|
||||
@staticmethod
|
||||
def _get_discovery_json(data: bytes, ip: str) -> dict:
|
||||
|
@ -25,19 +25,35 @@ if TYPE_CHECKING:
|
||||
|
||||
_LOGGER = logging.getLogger(__name__)
|
||||
|
||||
|
||||
def _mask_children(children: list[dict[str, Any]]) -> list[dict[str, Any]]:
|
||||
def mask_child(child: dict[str, Any], index: int) -> dict[str, Any]:
|
||||
result = {
|
||||
**child,
|
||||
"id": f"SCRUBBED_CHILD_DEVICE_ID_{index+1}",
|
||||
}
|
||||
# Will leave empty aliases as blank
|
||||
if child.get("alias"):
|
||||
result["alias"] = f"#MASKED_NAME# {index + 1}"
|
||||
return result
|
||||
|
||||
return [mask_child(child, index) for index, child in enumerate(children)]
|
||||
|
||||
|
||||
REDACTORS: dict[str, Callable[[Any], Any] | None] = {
|
||||
"latitude": lambda x: 0,
|
||||
"longitude": lambda x: 0,
|
||||
"latitude_i": lambda x: 0,
|
||||
"longitude_i": lambda x: 0,
|
||||
"deviceId": lambda x: "REDACTED_" + x[9::],
|
||||
"id": lambda x: "REDACTED_" + x[9::],
|
||||
"children": _mask_children,
|
||||
"alias": lambda x: "#MASKED_NAME#" if x else "",
|
||||
"mac": mask_mac,
|
||||
"mic_mac": mask_mac,
|
||||
"ssid": lambda x: "#MASKED_SSID#" if x else "",
|
||||
"oemId": lambda x: "REDACTED_" + x[9::],
|
||||
"username": lambda _: "user@example.com", # cnCloud
|
||||
"hwId": lambda x: "REDACTED_" + x[9::],
|
||||
}
|
||||
|
||||
|
||||
|
@ -66,6 +66,8 @@ def redact_data(data: _T, redactors: dict[str, Callable[[Any], Any] | None]) ->
|
||||
|
||||
def mask_mac(mac: str) -> str:
|
||||
"""Return mac address with last two octects blanked."""
|
||||
if len(mac) == 12:
|
||||
return f"{mac[:6]}000000"
|
||||
delim = ":" if ":" in mac else "-"
|
||||
rest = delim.join(format(s, "02x") for s in bytes.fromhex("000000"))
|
||||
return f"{mac[:8]}{delim}{rest}"
|
||||
|
@ -9,6 +9,7 @@ from __future__ import annotations
|
||||
import asyncio
|
||||
import base64
|
||||
import logging
|
||||
import re
|
||||
import time
|
||||
import uuid
|
||||
from collections.abc import Callable
|
||||
@ -45,15 +46,27 @@ REDACTORS: dict[str, Callable[[Any], Any] | None] = {
|
||||
"original_device_id": lambda x: "REDACTED_" + x[9::], # Strip children
|
||||
"nickname": lambda x: "I01BU0tFRF9OQU1FIw==" if x else "",
|
||||
"mac": mask_mac,
|
||||
"ssid": lambda x: "I01BU0tFRF9TU0lEIw=" if x else "",
|
||||
"ssid": lambda x: "I01BU0tFRF9TU0lEIw==" if x else "",
|
||||
"bssid": lambda _: "000000000000",
|
||||
"channel": lambda _: 0,
|
||||
"oem_id": lambda x: "REDACTED_" + x[9::],
|
||||
"setup_code": None, # matter
|
||||
"setup_payload": None, # matter
|
||||
"mfi_setup_code": None, # mfi_ for homekit
|
||||
"mfi_setup_id": None,
|
||||
"mfi_token_token": None,
|
||||
"mfi_token_uuid": None,
|
||||
"setup_code": lambda x: re.sub(r"\w", "0", x), # matter
|
||||
"setup_payload": lambda x: re.sub(r"\w", "0", x), # matter
|
||||
"mfi_setup_code": lambda x: re.sub(r"\w", "0", x), # mfi_ for homekit
|
||||
"mfi_setup_id": lambda x: re.sub(r"\w", "0", x),
|
||||
"mfi_token_token": lambda x: re.sub(r"\w", "0", x),
|
||||
"mfi_token_uuid": lambda x: re.sub(r"\w", "0", x),
|
||||
"ip": lambda x: x, # don't redact but keep listed here for dump_devinfo
|
||||
# smartcam
|
||||
"dev_id": lambda x: "REDACTED_" + x[9::],
|
||||
"device_name": lambda x: "#MASKED_NAME#" if x else "",
|
||||
"device_alias": lambda x: "#MASKED_NAME#" if x else "",
|
||||
"local_ip": lambda x: x, # don't redact but keep listed here for dump_devinfo
|
||||
# robovac
|
||||
"board_sn": lambda _: "000000000000",
|
||||
"custom_sn": lambda _: "000000000000",
|
||||
"location": lambda x: "#MASKED_NAME#" if x else "",
|
||||
"map_data": lambda x: "#SCRUBBED_MAPDATA#" if x else "",
|
||||
}
|
||||
|
||||
|
||||
|
@ -435,7 +435,7 @@ async def get_device_for_fixture(
|
||||
|
||||
discovery_data = None
|
||||
if "discovery_result" in fixture_data.data:
|
||||
discovery_data = fixture_data.data["discovery_result"]
|
||||
discovery_data = fixture_data.data["discovery_result"]["result"]
|
||||
elif "system" in fixture_data.data:
|
||||
discovery_data = {
|
||||
"system": {"get_sysinfo": fixture_data.data["system"]["get_sysinfo"]}
|
||||
|
@ -139,7 +139,8 @@ smart_discovery = parametrize_discovery("smart discovery", protocol_filter={"SMA
|
||||
)
|
||||
async def discovery_mock(request, mocker):
|
||||
"""Mock discovery and patch protocol queries to use Fake protocols."""
|
||||
fixture_info: FixtureInfo = request.param
|
||||
fi: FixtureInfo = request.param
|
||||
fixture_info = FixtureInfo(fi.name, fi.protocol, copy.deepcopy(fi.data))
|
||||
return patch_discovery({DISCOVERY_MOCK_IP: fixture_info}, mocker)
|
||||
|
||||
|
||||
@ -170,8 +171,8 @@ def create_discovery_mock(ip: str, fixture_data: dict):
|
||||
)
|
||||
|
||||
if "discovery_result" in fixture_data:
|
||||
discovery_data = {"result": fixture_data["discovery_result"].copy()}
|
||||
discovery_result = fixture_data["discovery_result"]
|
||||
discovery_data = fixture_data["discovery_result"].copy()
|
||||
discovery_result = fixture_data["discovery_result"]["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")
|
||||
@ -305,7 +306,7 @@ def discovery_data(request, mocker):
|
||||
mocker.patch("kasa.IotProtocol.query", return_value=fixture_data)
|
||||
mocker.patch("kasa.SmartProtocol.query", return_value=fixture_data)
|
||||
if "discovery_result" in fixture_data:
|
||||
return {"result": fixture_data["discovery_result"]}
|
||||
return fixture_data["discovery_result"].copy()
|
||||
else:
|
||||
return {"system": {"get_sysinfo": fixture_data["system"]["get_sysinfo"]}}
|
||||
|
||||
|
2
tests/fixtures/iot/EP10(US)_1.0_1.0.2.json
vendored
2
tests/fixtures/iot/EP10(US)_1.0_1.0.2.json
vendored
@ -2,7 +2,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "167 lamp",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Mini",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
10
tests/fixtures/iot/EP40(US)_1.0_1.0.2.json
vendored
10
tests/fixtures/iot/EP40(US)_1.0_1.0.2.json
vendored
@ -1,12 +1,12 @@
|
||||
{
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Smart Plug_004F",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Zombie",
|
||||
"id": "8006231E1499BAC4D4BC7EFCD4B075181E6393F200",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Magic",
|
||||
"id": "8006231E1499BAC4D4BC7EFCD4B075181E6393F201",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
2
tests/fixtures/iot/ES20M(US)_1.0_1.0.11.json
vendored
2
tests/fixtures/iot/ES20M(US)_1.0_1.0.11.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/ES20M(US)_1.0_1.0.8.json
vendored
2
tests/fixtures/iot/ES20M(US)_1.0_1.0.8.json
vendored
@ -78,7 +78,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Test ES20M",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"brightness": 35,
|
||||
"dev_name": "Wi-Fi Smart Dimmer with sensor",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
|
3
tests/fixtures/iot/HS100(UK)_4.1_1.1.0.json
vendored
3
tests/fixtures/iot/HS100(UK)_4.1_1.1.0.json
vendored
@ -1,5 +1,7 @@
|
||||
{
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "HS100(UK)",
|
||||
"device_type": "IOT.SMARTPLUGSWITCH",
|
||||
@ -13,6 +15,7 @@
|
||||
"is_support_https": false
|
||||
},
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
|
2
tests/fixtures/iot/HS100(US)_1.0_1.2.5.json
vendored
2
tests/fixtures/iot/HS100(US)_1.0_1.2.5.json
vendored
@ -18,7 +18,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "schedule",
|
||||
"alias": "Unused 3",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Wi-Fi Smart Plug",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS100(US)_2.0_1.5.6.json
vendored
2
tests/fixtures/iot/HS100(US)_2.0_1.5.6.json
vendored
@ -20,7 +20,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "3D Printer",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS103(US)_1.0_1.5.7.json
vendored
2
tests/fixtures/iot/HS103(US)_1.0_1.5.7.json
vendored
@ -20,7 +20,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "schedule",
|
||||
"alias": "Night lite",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Lite",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS103(US)_2.1_1.1.2.json
vendored
2
tests/fixtures/iot/HS103(US)_2.1_1.1.2.json
vendored
@ -18,7 +18,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Corner",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Lite",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS103(US)_2.1_1.1.4.json
vendored
2
tests/fixtures/iot/HS103(US)_2.1_1.1.4.json
vendored
@ -2,7 +2,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Plug",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Lite",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS105(US)_1.0_1.5.6.json
vendored
2
tests/fixtures/iot/HS105(US)_1.0_1.5.6.json
vendored
@ -20,7 +20,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Unused 1",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Mini",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
12
tests/fixtures/iot/HS107(US)_1.0_1.0.8.json
vendored
12
tests/fixtures/iot/HS107(US)_1.0_1.0.8.json
vendored
@ -17,12 +17,12 @@
|
||||
},
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Smart Plug_D310",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Garage Charger 1",
|
||||
"id": "00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -30,8 +30,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Garage Charger 2",
|
||||
"id": "01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -46,7 +46,7 @@
|
||||
"hw_ver": "1.0",
|
||||
"latitude_i": 0,
|
||||
"led_off": 0,
|
||||
"longitude_i": -0,
|
||||
"longitude_i": 0,
|
||||
"mac": "00:00:00:00:00:00",
|
||||
"mic_type": "IOT.SMARTPLUGSWITCH",
|
||||
"model": "HS107(US)",
|
||||
|
2
tests/fixtures/iot/HS110(EU)_1.0_1.2.5.json
vendored
2
tests/fixtures/iot/HS110(EU)_1.0_1.2.5.json
vendored
@ -11,7 +11,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "schedule",
|
||||
"alias": "Bedroom Lamp Plug",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Wi-Fi Smart Plug With Energy Monitoring",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS110(US)_1.0_1.2.6.json
vendored
2
tests/fixtures/iot/HS110(US)_1.0_1.2.6.json
vendored
@ -11,7 +11,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "schedule",
|
||||
"alias": "Home Google WiFi HS110",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Wi-Fi Smart Plug With Energy Monitoring",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS200(US)_2.0_1.5.7.json
vendored
2
tests/fixtures/iot/HS200(US)_2.0_1.5.7.json
vendored
@ -20,7 +20,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Master Bedroom Fan",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Light Switch",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS200(US)_5.0_1.0.2.json
vendored
2
tests/fixtures/iot/HS200(US)_5.0_1.0.2.json
vendored
@ -2,7 +2,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "House Fan",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Light Switch",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/HS210(US)_1.0_1.5.8.json
vendored
2
tests/fixtures/iot/HS210(US)_1.0_1.5.8.json
vendored
@ -21,7 +21,7 @@
|
||||
"get_sysinfo": {
|
||||
"abnormal_detect": 1,
|
||||
"active_mode": "none",
|
||||
"alias": "Garage Light",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi 3-Way Light Switch",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
6
tests/fixtures/iot/HS220(US)_1.0_1.5.7.json
vendored
6
tests/fixtures/iot/HS220(US)_1.0_1.5.7.json
vendored
@ -28,7 +28,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Living Room Dimmer Switch",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"brightness": 25,
|
||||
"dev_name": "Smart Wi-Fi Dimmer",
|
||||
"deviceId": "000000000000000000000000000000000000000",
|
||||
@ -38,9 +38,9 @@
|
||||
"hwId": "00000000000000000000000000000000",
|
||||
"hw_ver": "1.0",
|
||||
"icon_hash": "",
|
||||
"latitude_i": 11.6210,
|
||||
"latitude_i": 0,
|
||||
"led_off": 0,
|
||||
"longitude_i": 42.2074,
|
||||
"longitude_i": 0,
|
||||
"mac": "00:00:00:00:00:00",
|
||||
"mic_type": "IOT.SMARTPLUGSWITCH",
|
||||
"model": "HS220(US)",
|
||||
|
2
tests/fixtures/iot/HS220(US)_2.0_1.0.3.json
vendored
2
tests/fixtures/iot/HS220(US)_2.0_1.0.3.json
vendored
@ -17,7 +17,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Living Room Dimmer Switch",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"brightness": 100,
|
||||
"dev_name": "Wi-Fi Smart Dimmer",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
|
28
tests/fixtures/iot/HS300(US)_1.0_1.0.10.json
vendored
28
tests/fixtures/iot/HS300(US)_1.0_1.0.10.json
vendored
@ -22,12 +22,12 @@
|
||||
},
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Power Strip_DAE1",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 6,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Office Monitor 1",
|
||||
"id": "00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -35,8 +35,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Office Monitor 2",
|
||||
"id": "01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -44,8 +44,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Office Monitor 3",
|
||||
"id": "02",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -53,8 +53,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Office Laptop Dock",
|
||||
"id": "03",
|
||||
"alias": "#MASKED_NAME# 4",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_4",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -62,8 +62,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Office Desk Light",
|
||||
"id": "04",
|
||||
"alias": "#MASKED_NAME# 5",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_5",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -71,8 +71,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Laptop",
|
||||
"id": "05",
|
||||
"alias": "#MASKED_NAME# 6",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_6",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -87,7 +87,7 @@
|
||||
"hw_ver": "1.0",
|
||||
"latitude_i": 0,
|
||||
"led_off": 0,
|
||||
"longitude_i": -0,
|
||||
"longitude_i": 0,
|
||||
"mac": "00:00:00:00:00:00",
|
||||
"mic_type": "IOT.SMARTPLUGSWITCH",
|
||||
"model": "HS300(US)",
|
||||
|
26
tests/fixtures/iot/HS300(US)_1.0_1.0.21.json
vendored
26
tests/fixtures/iot/HS300(US)_1.0_1.0.21.json
vendored
@ -10,12 +10,12 @@
|
||||
},
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Power Strip_2CA9",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 6,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Home CameraPC",
|
||||
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -23,8 +23,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Home Firewalla",
|
||||
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -32,8 +32,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Home Cox modem",
|
||||
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED02",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -41,8 +41,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Home rpi3-2",
|
||||
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED03",
|
||||
"alias": "#MASKED_NAME# 4",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_4",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -50,8 +50,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Home Camera Switch",
|
||||
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED05",
|
||||
"alias": "#MASKED_NAME# 5",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_5",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -59,8 +59,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Home Network Switch",
|
||||
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED04",
|
||||
"alias": "#MASKED_NAME# 6",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_6",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
24
tests/fixtures/iot/HS300(US)_2.0_1.0.12.json
vendored
24
tests/fixtures/iot/HS300(US)_2.0_1.0.12.json
vendored
@ -15,8 +15,8 @@
|
||||
"child_num": 6,
|
||||
"children": [
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -24,8 +24,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -33,8 +33,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D02",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -42,8 +42,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D03",
|
||||
"alias": "#MASKED_NAME# 4",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_4",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -51,8 +51,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D04",
|
||||
"alias": "#MASKED_NAME# 5",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_5",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -60,8 +60,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D05",
|
||||
"alias": "#MASKED_NAME# 6",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_6",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
26
tests/fixtures/iot/HS300(US)_2.0_1.0.3.json
vendored
26
tests/fixtures/iot/HS300(US)_2.0_1.0.3.json
vendored
@ -11,12 +11,12 @@
|
||||
},
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Power Strip_5C33",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 6,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Plug 1",
|
||||
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031900",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -24,8 +24,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 2",
|
||||
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031901",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -33,8 +33,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 3",
|
||||
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031902",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -42,8 +42,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 4",
|
||||
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031903",
|
||||
"alias": "#MASKED_NAME# 4",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_4",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -51,8 +51,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 5",
|
||||
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031904",
|
||||
"alias": "#MASKED_NAME# 5",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_5",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -60,8 +60,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 6",
|
||||
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031905",
|
||||
"alias": "#MASKED_NAME# 6",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_6",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
2
tests/fixtures/iot/KL110(US)_1.0_1.8.11.json
vendored
2
tests/fixtures/iot/KL110(US)_1.0_1.8.11.json
vendored
@ -21,7 +21,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Bulb3",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL120(US)_1.0_1.8.11.json
vendored
2
tests/fixtures/iot/KL120(US)_1.0_1.8.11.json
vendored
@ -19,7 +19,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Home Family Room Table",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
8
tests/fixtures/iot/KL120(US)_1.0_1.8.6.json
vendored
8
tests/fixtures/iot/KL120(US)_1.0_1.8.6.json
vendored
@ -34,11 +34,11 @@
|
||||
},
|
||||
"description": "Smart Wi-Fi LED Bulb with Tunable White Light",
|
||||
"dev_state": "normal",
|
||||
"deviceId": "801200814AD69370AC59DE5501319C051AF409C3",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"disco_ver": "1.0",
|
||||
"err_code": 0,
|
||||
"heapsize": 290784,
|
||||
"hwId": "111E35908497A05512E259BB76801E10",
|
||||
"hwId": "00000000000000000000000000000000",
|
||||
"hw_ver": "1.0",
|
||||
"is_color": 0,
|
||||
"is_dimmable": 1,
|
||||
@ -52,10 +52,10 @@
|
||||
"on_off": 1,
|
||||
"saturation": 0
|
||||
},
|
||||
"mic_mac": "D80D17150474",
|
||||
"mic_mac": "D80D17000000",
|
||||
"mic_type": "IOT.SMARTBULB",
|
||||
"model": "KL120(US)",
|
||||
"oemId": "1210657CD7FBDC72895644388EEFAE8B",
|
||||
"oemId": "00000000000000000000000000000000",
|
||||
"preferred_state": [
|
||||
{
|
||||
"brightness": 100,
|
||||
|
2
tests/fixtures/iot/KL125(US)_1.20_1.0.5.json
vendored
2
tests/fixtures/iot/KL125(US)_1.20_1.0.5.json
vendored
@ -20,7 +20,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "kasa-bc01",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL125(US)_2.0_1.0.7.json
vendored
2
tests/fixtures/iot/KL125(US)_2.0_1.0.7.json
vendored
@ -22,7 +22,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Test bulb 6",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL130(EU)_1.0_1.8.8.json
vendored
2
tests/fixtures/iot/KL130(EU)_1.0_1.8.8.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KL130(US)_1.0_1.8.11.json
vendored
2
tests/fixtures/iot/KL130(US)_1.0_1.8.11.json
vendored
@ -21,7 +21,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Bulb2",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL135(US)_1.0_1.0.15.json
vendored
2
tests/fixtures/iot/KL135(US)_1.0_1.0.15.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KL135(US)_1.0_1.0.6.json
vendored
2
tests/fixtures/iot/KL135(US)_1.0_1.0.6.json
vendored
@ -20,7 +20,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "KL135 Bulb",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
@ -10,7 +10,7 @@
|
||||
"get_sysinfo": {
|
||||
"LEF": 0,
|
||||
"active_mode": "none",
|
||||
"alias": "Kl400",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
@ -10,7 +10,7 @@
|
||||
"get_sysinfo": {
|
||||
"LEF": 0,
|
||||
"active_mode": "none",
|
||||
"alias": "Kl400",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
@ -10,7 +10,7 @@
|
||||
"get_sysinfo": {
|
||||
"LEF": 1,
|
||||
"active_mode": "none",
|
||||
"alias": "Kl420 test",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL430(UN)_2.0_1.0.8.json
vendored
2
tests/fixtures/iot/KL430(UN)_2.0_1.0.8.json
vendored
@ -10,7 +10,7 @@
|
||||
"get_sysinfo": {
|
||||
"LEF": 1,
|
||||
"active_mode": "none",
|
||||
"alias": "Bedroom light strip",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL430(US)_1.0_1.0.10.json
vendored
2
tests/fixtures/iot/KL430(US)_1.0_1.0.10.json
vendored
@ -23,7 +23,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "schedule",
|
||||
"alias": "Bedroom Lightstrip",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL430(US)_2.0_1.0.11.json
vendored
2
tests/fixtures/iot/KL430(US)_2.0_1.0.11.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KL430(US)_2.0_1.0.8.json
vendored
2
tests/fixtures/iot/KL430(US)_2.0_1.0.8.json
vendored
@ -10,7 +10,7 @@
|
||||
"get_sysinfo": {
|
||||
"LEF": 1,
|
||||
"active_mode": "none",
|
||||
"alias": "89 strip",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL430(US)_2.0_1.0.9.json
vendored
2
tests/fixtures/iot/KL430(US)_2.0_1.0.9.json
vendored
@ -10,7 +10,7 @@
|
||||
"get_sysinfo": {
|
||||
"LEF": 1,
|
||||
"active_mode": "none",
|
||||
"alias": "kl430 updated",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KL50(US)_1.0_1.1.13.json
vendored
2
tests/fixtures/iot/KL50(US)_1.0_1.1.13.json
vendored
@ -22,7 +22,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Kl50",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
4
tests/fixtures/iot/KL60(UN)_1.0_1.1.4.json
vendored
4
tests/fixtures/iot/KL60(UN)_1.0_1.1.4.json
vendored
@ -32,7 +32,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "TP-LINK_Smart Bulb_9179",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
@ -60,7 +60,7 @@
|
||||
"on_off": 0
|
||||
},
|
||||
"longitude_i": 0,
|
||||
"mic_mac": "74DA88C89179",
|
||||
"mic_mac": "74DA88000000",
|
||||
"mic_type": "IOT.SMARTBULB",
|
||||
"model": "KL60(UN)",
|
||||
"oemId": "00000000000000000000000000000000",
|
||||
|
2
tests/fixtures/iot/KL60(US)_1.0_1.1.13.json
vendored
2
tests/fixtures/iot/KL60(US)_1.0_1.1.13.json
vendored
@ -22,7 +22,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Gold fil",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
2
tests/fixtures/iot/KP100(US)_3.0_1.0.1.json
vendored
2
tests/fixtures/iot/KP100(US)_3.0_1.0.1.json
vendored
@ -2,7 +2,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Kasa",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Mini",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KP105(UK)_1.0_1.0.5.json
vendored
2
tests/fixtures/iot/KP105(UK)_1.0_1.0.5.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": -7,
|
||||
|
2
tests/fixtures/iot/KP115(US)_1.0_1.0.17.json
vendored
2
tests/fixtures/iot/KP115(US)_1.0_1.0.17.json
vendored
@ -11,7 +11,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Test plug",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Mini",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KP125(US)_1.0_1.0.6.json
vendored
2
tests/fixtures/iot/KP125(US)_1.0_1.0.6.json
vendored
@ -11,7 +11,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Test plug",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Wi-Fi Plug Mini",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
10
tests/fixtures/iot/KP200(US)_3.0_1.0.3.json
vendored
10
tests/fixtures/iot/KP200(US)_3.0_1.0.3.json
vendored
@ -1,12 +1,12 @@
|
||||
{
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Smart Plug_C2D6",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "One ",
|
||||
"id": "80066788DFFFD572D9F2E4A5A6847669213E039F00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Two ",
|
||||
"id": "80066788DFFFD572D9F2E4A5A6847669213E039F01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
14
tests/fixtures/iot/KP303(UK)_1.0_1.0.3.json
vendored
14
tests/fixtures/iot/KP303(UK)_1.0_1.0.3.json
vendored
@ -1,12 +1,12 @@
|
||||
{
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "Bedroom Power Strip",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 3,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Plug 1",
|
||||
"id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7700",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Plug 2",
|
||||
"id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7701",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -23,8 +23,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 3",
|
||||
"id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7702",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
14
tests/fixtures/iot/KP303(US)_2.0_1.0.3.json
vendored
14
tests/fixtures/iot/KP303(US)_2.0_1.0.3.json
vendored
@ -1,12 +1,12 @@
|
||||
{
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Power Strip_BDF6",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 3,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Plug 1",
|
||||
"id": "800681855E0E9AEF096F4891B3DC88C71E59F42E00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 2",
|
||||
"id": "800681855E0E9AEF096F4891B3DC88C71E59F42E01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -23,8 +23,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 3",
|
||||
"id": "800681855E0E9AEF096F4891B3DC88C71E59F42E02",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
12
tests/fixtures/iot/KP303(US)_2.0_1.0.9.json
vendored
12
tests/fixtures/iot/KP303(US)_2.0_1.0.9.json
vendored
@ -5,8 +5,8 @@
|
||||
"child_num": 3,
|
||||
"children": [
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "800639AA097730E58235162FCDA301CE1F038F9101",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "800639AA097730E58235162FCDA301CE1F038F9102",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -23,8 +23,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "800639AA097730E58235162FCDA301CE1F038F9100",
|
||||
"alias": "#MASKED_NAME# 3",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_3",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
10
tests/fixtures/iot/KP400(US)_1.0_1.0.10.json
vendored
10
tests/fixtures/iot/KP400(US)_1.0_1.0.10.json
vendored
@ -17,12 +17,12 @@
|
||||
},
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Smart Plug_2ECE",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Rope",
|
||||
"id": "00",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"action": 1,
|
||||
"schd_sec": 69240,
|
||||
@ -32,8 +32,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "Plug 2",
|
||||
"id": "01",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
10
tests/fixtures/iot/KP400(US)_2.0_1.0.6.json
vendored
10
tests/fixtures/iot/KP400(US)_2.0_1.0.6.json
vendored
@ -1,12 +1,12 @@
|
||||
{
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"alias": "TP-LINK_Smart Plug_DC2A",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "Anc ",
|
||||
"id": "8006B8E953CC4149E2B13AA27E0D18EF1DCFBF3400",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "Plug 2",
|
||||
"id": "8006B8E953CC4149E2B13AA27E0D18EF1DCFBF3401",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
8
tests/fixtures/iot/KP400(US)_3.0_1.0.3.json
vendored
8
tests/fixtures/iot/KP400(US)_3.0_1.0.3.json
vendored
@ -5,8 +5,8 @@
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006521377E30159055A751347B5A5E321A8D0A100",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 1
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006521377E30159055A751347B5A5E321A8D0A101",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
8
tests/fixtures/iot/KP400(US)_3.0_1.0.4.json
vendored
8
tests/fixtures/iot/KP400(US)_3.0_1.0.4.json
vendored
@ -5,8 +5,8 @@
|
||||
"child_num": 2,
|
||||
"children": [
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006521377E30159055A751347B5A5E321A8D0A100",
|
||||
"alias": "#MASKED_NAME# 1",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
@ -14,8 +14,8 @@
|
||||
"state": 0
|
||||
},
|
||||
{
|
||||
"alias": "#MASKED_NAME#",
|
||||
"id": "8006521377E30159055A751347B5A5E321A8D0A101",
|
||||
"alias": "#MASKED_NAME# 2",
|
||||
"id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"next_action": {
|
||||
"type": -1
|
||||
},
|
||||
|
2
tests/fixtures/iot/KP401(US)_1.0_1.0.0.json
vendored
2
tests/fixtures/iot/KP401(US)_1.0_1.0.0.json
vendored
@ -2,7 +2,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Kp401",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Outdoor Plug",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KP405(US)_1.0_1.0.5.json
vendored
2
tests/fixtures/iot/KP405(US)_1.0_1.0.5.json
vendored
@ -15,7 +15,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Porch Lights",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"brightness": 50,
|
||||
"dev_name": "Kasa Smart Wi-Fi Outdoor Plug-In Dimmer",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
|
2
tests/fixtures/iot/KS200(US)_1.0_1.0.8.json
vendored
2
tests/fixtures/iot/KS200(US)_1.0_1.0.8.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KS200M(US)_1.0_1.0.8.json
vendored
2
tests/fixtures/iot/KS200M(US)_1.0_1.0.8.json
vendored
@ -66,7 +66,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Test KS200M",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"dev_name": "Smart Light Switch with PIR",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KS220(US)_1.0_1.0.13.json
vendored
2
tests/fixtures/iot/KS220(US)_1.0_1.0.13.json
vendored
@ -11,7 +11,7 @@
|
||||
"stopConnect": 0,
|
||||
"tcspInfo": "",
|
||||
"tcspStatus": 1,
|
||||
"username": "#MASKED_NAME#"
|
||||
"username": "user@example.com"
|
||||
},
|
||||
"get_intl_fw_list": {
|
||||
"err_code": 0,
|
||||
|
2
tests/fixtures/iot/KS220M(US)_1.0_1.0.4.json
vendored
2
tests/fixtures/iot/KS220M(US)_1.0_1.0.4.json
vendored
@ -78,7 +78,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Garage Entryway Lights",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"brightness": 100,
|
||||
"dev_name": "Wi-Fi Smart Dimmer with sensor",
|
||||
"deviceId": "0000000000000000000000000000000000000000",
|
||||
|
2
tests/fixtures/iot/KS230(US)_1.0_1.0.14.json
vendored
2
tests/fixtures/iot/KS230(US)_1.0_1.0.14.json
vendored
@ -14,7 +14,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "Test KS230",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"brightness": 60,
|
||||
"dc_state": 0,
|
||||
"dev_name": "Wi-Fi Smart 3-Way Dimmer",
|
||||
|
2
tests/fixtures/iot/LB110(US)_1.0_1.8.11.json
vendored
2
tests/fixtures/iot/LB110(US)_1.0_1.8.11.json
vendored
@ -21,7 +21,7 @@
|
||||
"system": {
|
||||
"get_sysinfo": {
|
||||
"active_mode": "none",
|
||||
"alias": "TP-LINK_Smart Bulb_43EC",
|
||||
"alias": "#MASKED_NAME#",
|
||||
"ctrl_protocols": {
|
||||
"name": "Linkie",
|
||||
"version": "1.0"
|
||||
|
3
tests/fixtures/smart/EP25(US)_2.6_1.0.1.json
vendored
3
tests/fixtures/smart/EP25(US)_2.6_1.0.1.json
vendored
@ -84,6 +84,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "EP25(US)",
|
||||
"device_type": "SMART.KASAPLUG",
|
||||
@ -99,6 +101,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
3
tests/fixtures/smart/EP25(US)_2.6_1.0.2.json
vendored
3
tests/fixtures/smart/EP25(US)_2.6_1.0.2.json
vendored
@ -88,6 +88,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "EP25(US)",
|
||||
"device_type": "SMART.KASAPLUG",
|
||||
@ -103,6 +105,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -379,6 +379,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "EP40M(US)",
|
||||
"device_type": "SMART.KASAPLUG",
|
||||
@ -394,6 +396,7 @@
|
||||
},
|
||||
"obd_src": "matter",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_auto_update_info": {
|
||||
"enable": true,
|
||||
|
3
tests/fixtures/smart/H100(EU)_1.0_1.2.3.json
vendored
3
tests/fixtures/smart/H100(EU)_1.0_1.2.3.json
vendored
@ -84,6 +84,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "H100(EU)",
|
||||
"device_type": "SMART.TAPOHUB",
|
||||
@ -99,6 +101,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": ""
|
||||
}
|
||||
},
|
||||
"get_auto_update_info": {
|
||||
"enable": true,
|
||||
|
@ -96,6 +96,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "H100(EU)",
|
||||
"device_type": "SMART.TAPOHUB",
|
||||
@ -111,6 +113,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_alarm_configure": {
|
||||
"duration": 10,
|
||||
|
7
tests/fixtures/smart/H100(EU)_1.0_1.5.5.json
vendored
7
tests/fixtures/smart/H100(EU)_1.0_1.5.5.json
vendored
@ -92,6 +92,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "H100(EU)",
|
||||
"device_type": "SMART.TAPOHUB",
|
||||
@ -107,6 +109,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_alarm_configure": {
|
||||
"duration": 10,
|
||||
@ -195,7 +198,7 @@
|
||||
"ver_code": 1
|
||||
}
|
||||
],
|
||||
"device_id": "0000000000000000000000000000000000000000"
|
||||
"device_id": "SCRUBBED_CHILD_DEVICE_ID_1"
|
||||
}
|
||||
],
|
||||
"start_index": 0,
|
||||
@ -213,7 +216,7 @@
|
||||
"current_humidity_exception": -34,
|
||||
"current_temp": 22.2,
|
||||
"current_temp_exception": 0,
|
||||
"device_id": "0000000000000000000000000000000000000000",
|
||||
"device_id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"fw_ver": "1.7.0 Build 230424 Rel.170332",
|
||||
"hw_id": "00000000000000000000000000000000",
|
||||
"hw_ver": "1.0",
|
||||
|
@ -80,6 +80,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "HS200(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -95,6 +97,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
17
tests/fixtures/smart/HS220(US)_3.26_1.0.1.json
vendored
17
tests/fixtures/smart/HS220(US)_3.26_1.0.1.json
vendored
@ -100,20 +100,23 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"owner": "00000000000000000000000000000000",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
"device_model": "HS220(US)",
|
||||
"ip": "127.0.0.123",
|
||||
"mac": "24-2F-D0-00-00-00",
|
||||
"is_support_iot_cloud": true,
|
||||
"obd_src": "tplink",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
"factory_default": false,
|
||||
"ip": "127.0.0.123",
|
||||
"is_support_iot_cloud": true,
|
||||
"mac": "24-2F-D0-00-00-00",
|
||||
"mgt_encrypt_schm": {
|
||||
"is_support_https": false,
|
||||
"encrypt_type": "AES",
|
||||
"http_port": 80,
|
||||
"is_support_https": false,
|
||||
"lv": 2
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
|
@ -84,6 +84,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KH100(EU)",
|
||||
"device_type": "SMART.KASAHUB",
|
||||
@ -99,6 +101,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_alarm_configure": {
|
||||
"duration": 300,
|
||||
|
@ -88,6 +88,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KH100(EU)",
|
||||
"device_type": "SMART.KASAHUB",
|
||||
@ -103,6 +105,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_alarm_configure": {
|
||||
"duration": 300,
|
||||
|
@ -88,6 +88,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KH100(UK)",
|
||||
"device_type": "SMART.KASAHUB",
|
||||
@ -103,6 +105,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_alarm_configure": {
|
||||
"duration": 300,
|
||||
|
@ -84,6 +84,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KP125M(US)",
|
||||
"device_type": "SMART.KASAPLUG",
|
||||
@ -99,6 +101,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_current_power": {
|
||||
"current_power": 17
|
||||
@ -124,7 +127,7 @@
|
||||
"longitude": 0,
|
||||
"mac": "00-00-00-00-00-00",
|
||||
"model": "KP125M",
|
||||
"nickname": "IyNNQVNLRUROQU1FIyM=",
|
||||
"nickname": "I01BU0tFRF9OQU1FIw==",
|
||||
"oem_id": "00000000000000000000000000000000",
|
||||
"on_time": 5332,
|
||||
"overheated": false,
|
||||
@ -133,7 +136,7 @@
|
||||
"rssi": -62,
|
||||
"signal_level": 2,
|
||||
"specs": "",
|
||||
"ssid": "IyNNQVNLRUROQU1FIyM=",
|
||||
"ssid": "I01BU0tFRF9TU0lEIw==",
|
||||
"time_diff": -360,
|
||||
"type": "SMART.KASAPLUG"
|
||||
},
|
||||
|
@ -88,6 +88,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KP125M(US)",
|
||||
"device_type": "SMART.KASAPLUG",
|
||||
@ -103,6 +105,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -80,6 +80,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS205(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -95,6 +97,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -76,6 +76,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS205(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -91,6 +93,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": ""
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -96,6 +96,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS225(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -111,6 +113,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -96,6 +96,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS225(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -111,6 +113,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": ""
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -414,6 +414,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS240(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -429,6 +431,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_auto_update_info": {
|
||||
"enable": false,
|
||||
|
11
tests/fixtures/smart/KS240(US)_1.0_1.0.5.json
vendored
11
tests/fixtures/smart/KS240(US)_1.0_1.0.5.json
vendored
@ -104,6 +104,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS240(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -119,6 +121,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_auto_update_info": {
|
||||
"enable": false,
|
||||
@ -206,7 +209,7 @@
|
||||
"ver_code": 1
|
||||
}
|
||||
],
|
||||
"device_id": "000000000000000000000000000000000000000001"
|
||||
"device_id": "SCRUBBED_CHILD_DEVICE_ID_1"
|
||||
},
|
||||
{
|
||||
"component_list": [
|
||||
@ -267,7 +270,7 @@
|
||||
"ver_code": 1
|
||||
}
|
||||
],
|
||||
"device_id": "000000000000000000000000000000000000000000"
|
||||
"device_id": "SCRUBBED_CHILD_DEVICE_ID_2"
|
||||
}
|
||||
],
|
||||
"start_index": 0,
|
||||
@ -279,7 +282,7 @@
|
||||
"avatar": "switch_ks240",
|
||||
"bind_count": 1,
|
||||
"category": "kasa.switch.outlet.sub-fan",
|
||||
"device_id": "000000000000000000000000000000000000000000",
|
||||
"device_id": "SCRUBBED_CHILD_DEVICE_ID_2",
|
||||
"device_on": true,
|
||||
"fan_sleep_mode_on": false,
|
||||
"fan_speed_level": 1,
|
||||
@ -317,7 +320,7 @@
|
||||
],
|
||||
"type": "last_states"
|
||||
},
|
||||
"device_id": "000000000000000000000000000000000000000001",
|
||||
"device_id": "SCRUBBED_CHILD_DEVICE_ID_1",
|
||||
"device_on": false,
|
||||
"fade_off_time": 1,
|
||||
"fade_on_time": 1,
|
||||
|
@ -425,6 +425,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "KS240(US)",
|
||||
"device_type": "SMART.KASASWITCH",
|
||||
@ -440,6 +442,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_auto_update_info": {
|
||||
"enable": true,
|
||||
|
@ -80,6 +80,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L510B(EU)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -95,6 +97,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -80,6 +80,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L510E(US)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -95,6 +97,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -88,6 +88,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L510E(US)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -103,6 +105,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -100,6 +100,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L530E(EU)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -115,6 +117,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -104,6 +104,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L530E(EU)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -119,6 +121,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
@ -104,6 +104,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L530E(EU)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -119,6 +121,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
@ -175,7 +178,7 @@
|
||||
"longitude": 0,
|
||||
"mac": "5C-E9-31-00-00-00",
|
||||
"model": "L530",
|
||||
"nickname": "TGl2aW5nIFJvb20gQnVsYg==",
|
||||
"nickname": "I01BU0tFRF9OQU1FIw==",
|
||||
"oem_id": "00000000000000000000000000000000",
|
||||
"overheated": false,
|
||||
"region": "Europe/Berlin",
|
||||
|
@ -104,6 +104,8 @@
|
||||
]
|
||||
},
|
||||
"discovery_result": {
|
||||
"error_code": 0,
|
||||
"result": {
|
||||
"device_id": "00000000000000000000000000000000",
|
||||
"device_model": "L530E(US)",
|
||||
"device_type": "SMART.TAPOBULB",
|
||||
@ -119,6 +121,7 @@
|
||||
},
|
||||
"obd_src": "tplink",
|
||||
"owner": "00000000000000000000000000000000"
|
||||
}
|
||||
},
|
||||
"get_antitheft_rules": {
|
||||
"antitheft_rule_max_count": 1,
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user