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

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:
Steven B. 2024-12-11 13:18:44 +00:00 committed by GitHub
parent 032cd5d2cc
commit 8cb5c2e180
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
140 changed files with 1771 additions and 1407 deletions

View File

@ -10,8 +10,6 @@ and finally execute a query to query all of them at once.
from __future__ import annotations from __future__ import annotations
import base64
import collections.abc
import dataclasses import dataclasses
import json import json
import logging import logging
@ -19,6 +17,7 @@ import re
import sys import sys
import traceback import traceback
from collections import defaultdict, namedtuple from collections import defaultdict, namedtuple
from collections.abc import Callable
from pathlib import Path from pathlib import Path
from pprint import pprint from pprint import pprint
from typing import Any from typing import Any
@ -39,13 +38,20 @@ from kasa import (
) )
from kasa.device_factory import get_protocol from kasa.device_factory import get_protocol
from kasa.deviceconfig import DeviceEncryptionType, DeviceFamily 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.exceptions import SmartErrorCode
from kasa.protocols import IotProtocol 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 ( from kasa.protocols.smartcamprotocol import (
SmartCamProtocol, SmartCamProtocol,
_ChildCameraProtocolWrapper, _ChildCameraProtocolWrapper,
) )
from kasa.protocols.smartprotocol import REDACTORS as SMART_REDACTORS
from kasa.protocols.smartprotocol import SmartProtocol, _ChildProtocolWrapper from kasa.protocols.smartprotocol import SmartProtocol, _ChildProtocolWrapper
from kasa.smart import SmartChildDevice, SmartDevice from kasa.smart import SmartChildDevice, SmartDevice
from kasa.smartcam import SmartCamDevice from kasa.smartcam import SmartCamDevice
@ -63,6 +69,42 @@ ENCRYPT_TYPES = [encrypt_type.value for encrypt_type in DeviceEncryptionType]
_LOGGER = logging.getLogger(__name__) _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 @dataclasses.dataclass
class SmartCall: class SmartCall:
"""Class for smart and smartcam calls.""" """Class for smart and smartcam calls."""
@ -74,115 +116,6 @@ class SmartCall:
supports_multiple: bool = True 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): def default_to_regular(d):
"""Convert nested defaultdicts to regular ones. """Convert nested defaultdicts to regular ones.
@ -209,7 +142,7 @@ async def handle_device(
for fixture_result in fixture_results: for fixture_result in fixture_results:
save_filename = Path(basedir) / fixture_result.folder / fixture_result.filename save_filename = Path(basedir) / fixture_result.folder / fixture_result.filename
pprint(scrub(fixture_result.data)) pprint(fixture_result.data)
if autosave: if autosave:
save = "y" save = "y"
else: else:
@ -325,6 +258,11 @@ async def cli(
if debug: if debug:
logging.basicConfig(level=logging.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) credentials = Credentials(username=username, password=password)
if host is not None: if host is not None:
if discovery_info: if discovery_info:
@ -377,12 +315,16 @@ async def cli(
credentials=credentials, credentials=credentials,
port=port, port=port,
discovery_timeout=discovery_timeout, 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( await handle_device(
basedir, basedir,
autosave, autosave,
device.protocol, device.protocol,
discovery_info=device._discovery_info, discovery_info=discovery_info,
batch_size=batch_size, batch_size=batch_size,
) )
else: else:
@ -391,21 +333,28 @@ async def cli(
f" {target}. Use --target to override." f" {target}. Use --target to override."
) )
devices = await Discover.discover( 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") click.echo(f"Detected {len(devices)} devices")
for dev in devices.values(): 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( await handle_device(
basedir, basedir,
autosave, autosave,
dev.protocol, dev.protocol,
discovery_info=dev._discovery_info, discovery_info=discovery_info,
batch_size=batch_size, batch_size=batch_size,
) )
async def get_legacy_fixture( async def get_legacy_fixture(
protocol: IotProtocol, *, discovery_info: dict[str, Any] | None protocol: IotProtocol, *, discovery_info: dict[str, dict[str, Any]] | None
) -> FixtureResult: ) -> FixtureResult:
"""Get fixture for legacy IOT style protocol.""" """Get fixture for legacy IOT style protocol."""
items = [ items = [
@ -475,11 +424,21 @@ async def get_legacy_fixture(
_echo_error(f"Unable to query all successes at once: {ex}") _echo_error(f"Unable to query all successes at once: {ex}")
finally: finally:
await protocol.close() 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"): if discovery_info and not discovery_info.get("system"):
# Need to recreate a DiscoverResult here because we don't want the aliases final["discovery_result"] = redact_data(
# in the fixture, we want the actual field names as returned by the device. discovery_info, _wrap_redactors(NEW_DISCOVERY_REDACTORS)
dr = DiscoveryResult.from_dict(discovery_info) )
final["discovery_result"] = dr.to_dict()
click.echo(f"Got {len(successes)} successes") click.echo(f"Got {len(successes)} successes")
click.echo(click.style("## device info file ##", bold=True)) click.echo(click.style("## device info file ##", bold=True))
@ -867,7 +826,10 @@ def get_smart_child_fixture(response):
async def get_smart_fixtures( 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]: ) -> list[FixtureResult]:
"""Get fixture for new TAPO style protocol.""" """Get fixture for new TAPO style protocol."""
if isinstance(protocol, SmartCamProtocol): if isinstance(protocol, SmartCamProtocol):
@ -988,22 +950,24 @@ async def get_smart_fixtures(
continue continue
_LOGGER.error("Could not find a device for the child device: %s", child) _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 final = redact_data(final, _wrap_redactors(SMART_REDACTORS))
# in the fixture, we want the actual field names as returned by the device. discovery_result = None
if discovery_info: if discovery_info:
dr = DiscoveryResult.from_dict(discovery_info) # type: ignore final["discovery_result"] = redact_data(
final["discovery_result"] = dr.to_dict() discovery_info, _wrap_redactors(NEW_DISCOVERY_REDACTORS)
)
discovery_result = discovery_info["result"]
click.echo(f"Got {len(successes)} successes") click.echo(f"Got {len(successes)} successes")
click.echo(click.style("## device info file ##", bold=True)) click.echo(click.style("## device info file ##", bold=True))
if "get_device_info" in final: if "get_device_info" in final:
# smart protocol # smart protocol
model_info = SmartDevice._get_device_info(final, discovery_info) model_info = SmartDevice._get_device_info(final, discovery_result)
copy_folder = SMART_FOLDER copy_folder = SMART_FOLDER
else: else:
# smart camera protocol # 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 copy_folder = SMARTCAM_FOLDER
hw_version = model_info.hardware_version hw_version = model_info.hardware_version
sw_version = model_info.firmware_version sw_version = model_info.firmware_version

View File

@ -205,7 +205,7 @@ def _get_supported_devices(
fixture_data = json.load(f) fixture_data = json.load(f)
model_info = device_cls._get_device_info( 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] supported_type = DEVICE_TYPE_TO_PRODUCT_GROUP[model_info.device_type]

128
devtools/update_fixtures.py Normal file
View 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()

View File

@ -168,6 +168,12 @@ OnUnsupportedCallable = Callable[[UnsupportedDeviceError], Coroutine]
OnConnectAttemptCallable = Callable[[ConnectAttempt, bool], None] OnConnectAttemptCallable = Callable[[ConnectAttempt, bool], None]
DeviceDict = dict[str, Device] 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] = { NEW_DISCOVERY_REDACTORS: dict[str, Callable[[Any], Any] | None] = {
"device_id": lambda x: "REDACTED_" + x[9::], "device_id": lambda x: "REDACTED_" + x[9::],
"device_name": lambda x: "#MASKED_NAME#" if x else "", "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_id": lambda x: "REDACTED_" + x[9::],
"group_name": lambda x: "I01BU0tFRF9TU0lEIw==", "group_name": lambda x: "I01BU0tFRF9TU0lEIw==",
"encrypt_info": lambda x: {**x, "key": "", "data": ""}, "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 @staticmethod
def _decrypt_discovery_data(discovery_result: DiscoveryResult) -> None: def _decrypt_discovery_data(discovery_result: DiscoveryResult) -> None:
debug_enabled = _LOGGER.isEnabledFor(logging.DEBUG)
if TYPE_CHECKING: if TYPE_CHECKING:
assert discovery_result.encrypt_info assert discovery_result.encrypt_info
assert _AesDiscoveryQuery.keypair assert _AesDiscoveryQuery.keypair
@ -757,7 +766,19 @@ class Discover:
session = AesEncyptionSession(key, iv) session = AesEncyptionSession(key, iv)
decrypted_data = session.decrypt(encrypted_data) 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 @staticmethod
def _get_discovery_json(data: bytes, ip: str) -> dict: def _get_discovery_json(data: bytes, ip: str) -> dict:

View File

@ -25,19 +25,35 @@ if TYPE_CHECKING:
_LOGGER = logging.getLogger(__name__) _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] = { REDACTORS: dict[str, Callable[[Any], Any] | None] = {
"latitude": lambda x: 0, "latitude": lambda x: 0,
"longitude": lambda x: 0, "longitude": lambda x: 0,
"latitude_i": lambda x: 0, "latitude_i": lambda x: 0,
"longitude_i": lambda x: 0, "longitude_i": lambda x: 0,
"deviceId": lambda x: "REDACTED_" + x[9::], "deviceId": lambda x: "REDACTED_" + x[9::],
"id": lambda x: "REDACTED_" + x[9::], "children": _mask_children,
"alias": lambda x: "#MASKED_NAME#" if x else "", "alias": lambda x: "#MASKED_NAME#" if x else "",
"mac": mask_mac, "mac": mask_mac,
"mic_mac": mask_mac, "mic_mac": mask_mac,
"ssid": lambda x: "#MASKED_SSID#" if x else "", "ssid": lambda x: "#MASKED_SSID#" if x else "",
"oemId": lambda x: "REDACTED_" + x[9::], "oemId": lambda x: "REDACTED_" + x[9::],
"username": lambda _: "user@example.com", # cnCloud "username": lambda _: "user@example.com", # cnCloud
"hwId": lambda x: "REDACTED_" + x[9::],
} }

View File

@ -66,6 +66,8 @@ def redact_data(data: _T, redactors: dict[str, Callable[[Any], Any] | None]) ->
def mask_mac(mac: str) -> str: def mask_mac(mac: str) -> str:
"""Return mac address with last two octects blanked.""" """Return mac address with last two octects blanked."""
if len(mac) == 12:
return f"{mac[:6]}000000"
delim = ":" if ":" in mac else "-" delim = ":" if ":" in mac else "-"
rest = delim.join(format(s, "02x") for s in bytes.fromhex("000000")) rest = delim.join(format(s, "02x") for s in bytes.fromhex("000000"))
return f"{mac[:8]}{delim}{rest}" return f"{mac[:8]}{delim}{rest}"

View File

@ -9,6 +9,7 @@ from __future__ import annotations
import asyncio import asyncio
import base64 import base64
import logging import logging
import re
import time import time
import uuid import uuid
from collections.abc import Callable 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 "original_device_id": lambda x: "REDACTED_" + x[9::], # Strip children
"nickname": lambda x: "I01BU0tFRF9OQU1FIw==" if x else "", "nickname": lambda x: "I01BU0tFRF9OQU1FIw==" if x else "",
"mac": mask_mac, "mac": mask_mac,
"ssid": lambda x: "I01BU0tFRF9TU0lEIw=" if x else "", "ssid": lambda x: "I01BU0tFRF9TU0lEIw==" if x else "",
"bssid": lambda _: "000000000000", "bssid": lambda _: "000000000000",
"channel": lambda _: 0,
"oem_id": lambda x: "REDACTED_" + x[9::], "oem_id": lambda x: "REDACTED_" + x[9::],
"setup_code": None, # matter "setup_code": lambda x: re.sub(r"\w", "0", x), # matter
"setup_payload": None, # matter "setup_payload": lambda x: re.sub(r"\w", "0", x), # matter
"mfi_setup_code": None, # mfi_ for homekit "mfi_setup_code": lambda x: re.sub(r"\w", "0", x), # mfi_ for homekit
"mfi_setup_id": None, "mfi_setup_id": lambda x: re.sub(r"\w", "0", x),
"mfi_token_token": None, "mfi_token_token": lambda x: re.sub(r"\w", "0", x),
"mfi_token_uuid": None, "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 "",
} }

View File

@ -435,7 +435,7 @@ async def get_device_for_fixture(
discovery_data = None discovery_data = None
if "discovery_result" in fixture_data.data: 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: elif "system" in fixture_data.data:
discovery_data = { discovery_data = {
"system": {"get_sysinfo": fixture_data.data["system"]["get_sysinfo"]} "system": {"get_sysinfo": fixture_data.data["system"]["get_sysinfo"]}

View File

@ -139,7 +139,8 @@ smart_discovery = parametrize_discovery("smart discovery", protocol_filter={"SMA
) )
async def discovery_mock(request, mocker): async def discovery_mock(request, mocker):
"""Mock discovery and patch protocol queries to use Fake protocols.""" """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) 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: if "discovery_result" in fixture_data:
discovery_data = {"result": fixture_data["discovery_result"].copy()} discovery_data = fixture_data["discovery_result"].copy()
discovery_result = fixture_data["discovery_result"] discovery_result = fixture_data["discovery_result"]["result"]
device_type = discovery_result["device_type"] device_type = discovery_result["device_type"]
encrypt_type = discovery_result["mgt_encrypt_schm"].get( encrypt_type = discovery_result["mgt_encrypt_schm"].get(
"encrypt_type", discovery_result.get("encrypt_info", {}).get("sym_schm") "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.IotProtocol.query", return_value=fixture_data)
mocker.patch("kasa.SmartProtocol.query", return_value=fixture_data) mocker.patch("kasa.SmartProtocol.query", return_value=fixture_data)
if "discovery_result" in fixture_data: if "discovery_result" in fixture_data:
return {"result": fixture_data["discovery_result"]} return fixture_data["discovery_result"].copy()
else: else:
return {"system": {"get_sysinfo": fixture_data["system"]["get_sysinfo"]}} return {"system": {"get_sysinfo": fixture_data["system"]["get_sysinfo"]}}

View File

@ -2,7 +2,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "167 lamp", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Mini", "dev_name": "Smart Wi-Fi Plug Mini",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -1,12 +1,12 @@
{ {
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Smart Plug_004F", "alias": "#MASKED_NAME#",
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "Zombie", "alias": "#MASKED_NAME# 1",
"id": "8006231E1499BAC4D4BC7EFCD4B075181E6393F200", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Magic", "alias": "#MASKED_NAME# 2",
"id": "8006231E1499BAC4D4BC7EFCD4B075181E6393F201", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -78,7 +78,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Test ES20M", "alias": "#MASKED_NAME#",
"brightness": 35, "brightness": 35,
"dev_name": "Wi-Fi Smart Dimmer with sensor", "dev_name": "Wi-Fi Smart Dimmer with sensor",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",

View File

@ -1,5 +1,7 @@
{ {
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "HS100(UK)", "device_model": "HS100(UK)",
"device_type": "IOT.SMARTPLUGSWITCH", "device_type": "IOT.SMARTPLUGSWITCH",
@ -13,6 +15,7 @@
"is_support_https": false "is_support_https": false
}, },
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {

View File

@ -18,7 +18,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "schedule", "active_mode": "schedule",
"alias": "Unused 3", "alias": "#MASKED_NAME#",
"dev_name": "Wi-Fi Smart Plug", "dev_name": "Wi-Fi Smart Plug",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -20,7 +20,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "3D Printer", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug", "dev_name": "Smart Wi-Fi Plug",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -20,7 +20,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "schedule", "active_mode": "schedule",
"alias": "Night lite", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Lite", "dev_name": "Smart Wi-Fi Plug Lite",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -18,7 +18,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Corner", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Lite", "dev_name": "Smart Wi-Fi Plug Lite",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -2,7 +2,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Plug", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Lite", "dev_name": "Smart Wi-Fi Plug Lite",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -20,7 +20,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Unused 1", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Mini", "dev_name": "Smart Wi-Fi Plug Mini",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -17,12 +17,12 @@
}, },
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Smart Plug_D310", "alias": "#MASKED_NAME#",
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "Garage Charger 1", "alias": "#MASKED_NAME# 1",
"id": "00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -30,8 +30,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Garage Charger 2", "alias": "#MASKED_NAME# 2",
"id": "01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -46,7 +46,7 @@
"hw_ver": "1.0", "hw_ver": "1.0",
"latitude_i": 0, "latitude_i": 0,
"led_off": 0, "led_off": 0,
"longitude_i": -0, "longitude_i": 0,
"mac": "00:00:00:00:00:00", "mac": "00:00:00:00:00:00",
"mic_type": "IOT.SMARTPLUGSWITCH", "mic_type": "IOT.SMARTPLUGSWITCH",
"model": "HS107(US)", "model": "HS107(US)",

View File

@ -11,7 +11,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "schedule", "active_mode": "schedule",
"alias": "Bedroom Lamp Plug", "alias": "#MASKED_NAME#",
"dev_name": "Wi-Fi Smart Plug With Energy Monitoring", "dev_name": "Wi-Fi Smart Plug With Energy Monitoring",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -11,7 +11,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "schedule", "active_mode": "schedule",
"alias": "Home Google WiFi HS110", "alias": "#MASKED_NAME#",
"dev_name": "Wi-Fi Smart Plug With Energy Monitoring", "dev_name": "Wi-Fi Smart Plug With Energy Monitoring",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -20,7 +20,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Master Bedroom Fan", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Light Switch", "dev_name": "Smart Wi-Fi Light Switch",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -2,7 +2,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "House Fan", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Light Switch", "dev_name": "Smart Wi-Fi Light Switch",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -21,7 +21,7 @@
"get_sysinfo": { "get_sysinfo": {
"abnormal_detect": 1, "abnormal_detect": 1,
"active_mode": "none", "active_mode": "none",
"alias": "Garage Light", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi 3-Way Light Switch", "dev_name": "Smart Wi-Fi 3-Way Light Switch",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -28,7 +28,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Living Room Dimmer Switch", "alias": "#MASKED_NAME#",
"brightness": 25, "brightness": 25,
"dev_name": "Smart Wi-Fi Dimmer", "dev_name": "Smart Wi-Fi Dimmer",
"deviceId": "000000000000000000000000000000000000000", "deviceId": "000000000000000000000000000000000000000",
@ -38,9 +38,9 @@
"hwId": "00000000000000000000000000000000", "hwId": "00000000000000000000000000000000",
"hw_ver": "1.0", "hw_ver": "1.0",
"icon_hash": "", "icon_hash": "",
"latitude_i": 11.6210, "latitude_i": 0,
"led_off": 0, "led_off": 0,
"longitude_i": 42.2074, "longitude_i": 0,
"mac": "00:00:00:00:00:00", "mac": "00:00:00:00:00:00",
"mic_type": "IOT.SMARTPLUGSWITCH", "mic_type": "IOT.SMARTPLUGSWITCH",
"model": "HS220(US)", "model": "HS220(US)",

View File

@ -17,7 +17,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Living Room Dimmer Switch", "alias": "#MASKED_NAME#",
"brightness": 100, "brightness": 100,
"dev_name": "Wi-Fi Smart Dimmer", "dev_name": "Wi-Fi Smart Dimmer",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",

View File

@ -22,12 +22,12 @@
}, },
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Power Strip_DAE1", "alias": "#MASKED_NAME#",
"child_num": 6, "child_num": 6,
"children": [ "children": [
{ {
"alias": "Office Monitor 1", "alias": "#MASKED_NAME# 1",
"id": "00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -35,8 +35,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Office Monitor 2", "alias": "#MASKED_NAME# 2",
"id": "01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -44,8 +44,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Office Monitor 3", "alias": "#MASKED_NAME# 3",
"id": "02", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -53,8 +53,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Office Laptop Dock", "alias": "#MASKED_NAME# 4",
"id": "03", "id": "SCRUBBED_CHILD_DEVICE_ID_4",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -62,8 +62,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Office Desk Light", "alias": "#MASKED_NAME# 5",
"id": "04", "id": "SCRUBBED_CHILD_DEVICE_ID_5",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -71,8 +71,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Laptop", "alias": "#MASKED_NAME# 6",
"id": "05", "id": "SCRUBBED_CHILD_DEVICE_ID_6",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -87,7 +87,7 @@
"hw_ver": "1.0", "hw_ver": "1.0",
"latitude_i": 0, "latitude_i": 0,
"led_off": 0, "led_off": 0,
"longitude_i": -0, "longitude_i": 0,
"mac": "00:00:00:00:00:00", "mac": "00:00:00:00:00:00",
"mic_type": "IOT.SMARTPLUGSWITCH", "mic_type": "IOT.SMARTPLUGSWITCH",
"model": "HS300(US)", "model": "HS300(US)",

View File

@ -10,12 +10,12 @@
}, },
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Power Strip_2CA9", "alias": "#MASKED_NAME#",
"child_num": 6, "child_num": 6,
"children": [ "children": [
{ {
"alias": "Home CameraPC", "alias": "#MASKED_NAME# 1",
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -23,8 +23,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Home Firewalla", "alias": "#MASKED_NAME# 2",
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -32,8 +32,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Home Cox modem", "alias": "#MASKED_NAME# 3",
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED02", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -41,8 +41,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Home rpi3-2", "alias": "#MASKED_NAME# 4",
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED03", "id": "SCRUBBED_CHILD_DEVICE_ID_4",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -50,8 +50,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Home Camera Switch", "alias": "#MASKED_NAME# 5",
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED05", "id": "SCRUBBED_CHILD_DEVICE_ID_5",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -59,8 +59,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Home Network Switch", "alias": "#MASKED_NAME# 6",
"id": "800623145DFF1AA096363EFD161C2E661A9D8DED04", "id": "SCRUBBED_CHILD_DEVICE_ID_6",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -15,8 +15,8 @@
"child_num": 6, "child_num": 6,
"children": [ "children": [
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 1",
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -24,8 +24,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 2",
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -33,8 +33,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 3",
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D02", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -42,8 +42,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 4",
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D03", "id": "SCRUBBED_CHILD_DEVICE_ID_4",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -51,8 +51,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 5",
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D04", "id": "SCRUBBED_CHILD_DEVICE_ID_5",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -60,8 +60,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 6",
"id": "8006A0F1D01120C3F93794F7AACACDBE1EAD246D05", "id": "SCRUBBED_CHILD_DEVICE_ID_6",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -11,12 +11,12 @@
}, },
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Power Strip_5C33", "alias": "#MASKED_NAME#",
"child_num": 6, "child_num": 6,
"children": [ "children": [
{ {
"alias": "Plug 1", "alias": "#MASKED_NAME# 1",
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031900", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -24,8 +24,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 2", "alias": "#MASKED_NAME# 2",
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031901", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -33,8 +33,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 3", "alias": "#MASKED_NAME# 3",
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031902", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -42,8 +42,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 4", "alias": "#MASKED_NAME# 4",
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031903", "id": "SCRUBBED_CHILD_DEVICE_ID_4",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -51,8 +51,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 5", "alias": "#MASKED_NAME# 5",
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031904", "id": "SCRUBBED_CHILD_DEVICE_ID_5",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -60,8 +60,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 6", "alias": "#MASKED_NAME# 6",
"id": "8006AF35494E7DB13DDE9B8F40BF2E001E77031905", "id": "SCRUBBED_CHILD_DEVICE_ID_6",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -21,7 +21,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Bulb3", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -19,7 +19,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Home Family Room Table", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -34,11 +34,11 @@
}, },
"description": "Smart Wi-Fi LED Bulb with Tunable White Light", "description": "Smart Wi-Fi LED Bulb with Tunable White Light",
"dev_state": "normal", "dev_state": "normal",
"deviceId": "801200814AD69370AC59DE5501319C051AF409C3", "deviceId": "0000000000000000000000000000000000000000",
"disco_ver": "1.0", "disco_ver": "1.0",
"err_code": 0, "err_code": 0,
"heapsize": 290784, "heapsize": 290784,
"hwId": "111E35908497A05512E259BB76801E10", "hwId": "00000000000000000000000000000000",
"hw_ver": "1.0", "hw_ver": "1.0",
"is_color": 0, "is_color": 0,
"is_dimmable": 1, "is_dimmable": 1,
@ -52,10 +52,10 @@
"on_off": 1, "on_off": 1,
"saturation": 0 "saturation": 0
}, },
"mic_mac": "D80D17150474", "mic_mac": "D80D17000000",
"mic_type": "IOT.SMARTBULB", "mic_type": "IOT.SMARTBULB",
"model": "KL120(US)", "model": "KL120(US)",
"oemId": "1210657CD7FBDC72895644388EEFAE8B", "oemId": "00000000000000000000000000000000",
"preferred_state": [ "preferred_state": [
{ {
"brightness": 100, "brightness": 100,

View File

@ -20,7 +20,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "kasa-bc01", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -22,7 +22,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Test bulb 6", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -21,7 +21,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Bulb2", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -20,7 +20,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "KL135 Bulb", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -10,7 +10,7 @@
"get_sysinfo": { "get_sysinfo": {
"LEF": 0, "LEF": 0,
"active_mode": "none", "active_mode": "none",
"alias": "Kl400", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -10,7 +10,7 @@
"get_sysinfo": { "get_sysinfo": {
"LEF": 0, "LEF": 0,
"active_mode": "none", "active_mode": "none",
"alias": "Kl400", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -10,7 +10,7 @@
"get_sysinfo": { "get_sysinfo": {
"LEF": 1, "LEF": 1,
"active_mode": "none", "active_mode": "none",
"alias": "Kl420 test", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -10,7 +10,7 @@
"get_sysinfo": { "get_sysinfo": {
"LEF": 1, "LEF": 1,
"active_mode": "none", "active_mode": "none",
"alias": "Bedroom light strip", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -23,7 +23,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "schedule", "active_mode": "schedule",
"alias": "Bedroom Lightstrip", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -10,7 +10,7 @@
"get_sysinfo": { "get_sysinfo": {
"LEF": 1, "LEF": 1,
"active_mode": "none", "active_mode": "none",
"alias": "89 strip", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -10,7 +10,7 @@
"get_sysinfo": { "get_sysinfo": {
"LEF": 1, "LEF": 1,
"active_mode": "none", "active_mode": "none",
"alias": "kl430 updated", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -22,7 +22,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Kl50", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -32,7 +32,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "TP-LINK_Smart Bulb_9179", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"
@ -60,7 +60,7 @@
"on_off": 0 "on_off": 0
}, },
"longitude_i": 0, "longitude_i": 0,
"mic_mac": "74DA88C89179", "mic_mac": "74DA88000000",
"mic_type": "IOT.SMARTBULB", "mic_type": "IOT.SMARTBULB",
"model": "KL60(UN)", "model": "KL60(UN)",
"oemId": "00000000000000000000000000000000", "oemId": "00000000000000000000000000000000",

View File

@ -22,7 +22,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Gold fil", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -2,7 +2,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Kasa", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Mini", "dev_name": "Smart Wi-Fi Plug Mini",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": -7, "err_code": -7,

View File

@ -11,7 +11,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Test plug", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Mini", "dev_name": "Smart Wi-Fi Plug Mini",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -11,7 +11,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Test plug", "alias": "#MASKED_NAME#",
"dev_name": "Smart Wi-Fi Plug Mini", "dev_name": "Smart Wi-Fi Plug Mini",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -1,12 +1,12 @@
{ {
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Smart Plug_C2D6", "alias": "#MASKED_NAME#",
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "One ", "alias": "#MASKED_NAME# 1",
"id": "80066788DFFFD572D9F2E4A5A6847669213E039F00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Two ", "alias": "#MASKED_NAME# 2",
"id": "80066788DFFFD572D9F2E4A5A6847669213E039F01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -1,12 +1,12 @@
{ {
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "Bedroom Power Strip", "alias": "#MASKED_NAME#",
"child_num": 3, "child_num": 3,
"children": [ "children": [
{ {
"alias": "Plug 1", "alias": "#MASKED_NAME# 1",
"id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7700", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Plug 2", "alias": "#MASKED_NAME# 2",
"id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7701", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -23,8 +23,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 3", "alias": "#MASKED_NAME# 3",
"id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7702", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -1,12 +1,12 @@
{ {
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Power Strip_BDF6", "alias": "#MASKED_NAME#",
"child_num": 3, "child_num": 3,
"children": [ "children": [
{ {
"alias": "Plug 1", "alias": "#MASKED_NAME# 1",
"id": "800681855E0E9AEF096F4891B3DC88C71E59F42E00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 2", "alias": "#MASKED_NAME# 2",
"id": "800681855E0E9AEF096F4891B3DC88C71E59F42E01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -23,8 +23,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 3", "alias": "#MASKED_NAME# 3",
"id": "800681855E0E9AEF096F4891B3DC88C71E59F42E02", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -5,8 +5,8 @@
"child_num": 3, "child_num": 3,
"children": [ "children": [
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 1",
"id": "800639AA097730E58235162FCDA301CE1F038F9101", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 2",
"id": "800639AA097730E58235162FCDA301CE1F038F9102", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -23,8 +23,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 3",
"id": "800639AA097730E58235162FCDA301CE1F038F9100", "id": "SCRUBBED_CHILD_DEVICE_ID_3",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -17,12 +17,12 @@
}, },
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Smart Plug_2ECE", "alias": "#MASKED_NAME#",
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "Rope", "alias": "#MASKED_NAME# 1",
"id": "00", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"action": 1, "action": 1,
"schd_sec": 69240, "schd_sec": 69240,
@ -32,8 +32,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "Plug 2", "alias": "#MASKED_NAME# 2",
"id": "01", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -1,12 +1,12 @@
{ {
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"alias": "TP-LINK_Smart Plug_DC2A", "alias": "#MASKED_NAME#",
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "Anc ", "alias": "#MASKED_NAME# 1",
"id": "8006B8E953CC4149E2B13AA27E0D18EF1DCFBF3400", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "Plug 2", "alias": "#MASKED_NAME# 2",
"id": "8006B8E953CC4149E2B13AA27E0D18EF1DCFBF3401", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -5,8 +5,8 @@
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 1",
"id": "8006521377E30159055A751347B5A5E321A8D0A100", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 1 "state": 1
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 2",
"id": "8006521377E30159055A751347B5A5E321A8D0A101", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -5,8 +5,8 @@
"child_num": 2, "child_num": 2,
"children": [ "children": [
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 1",
"id": "8006521377E30159055A751347B5A5E321A8D0A100", "id": "SCRUBBED_CHILD_DEVICE_ID_1",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },
@ -14,8 +14,8 @@
"state": 0 "state": 0
}, },
{ {
"alias": "#MASKED_NAME#", "alias": "#MASKED_NAME# 2",
"id": "8006521377E30159055A751347B5A5E321A8D0A101", "id": "SCRUBBED_CHILD_DEVICE_ID_2",
"next_action": { "next_action": {
"type": -1 "type": -1
}, },

View File

@ -2,7 +2,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Kp401", "alias": "#MASKED_NAME#",
"dev_name": "Smart Outdoor Plug", "dev_name": "Smart Outdoor Plug",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -15,7 +15,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Porch Lights", "alias": "#MASKED_NAME#",
"brightness": 50, "brightness": 50,
"dev_name": "Kasa Smart Wi-Fi Outdoor Plug-In Dimmer", "dev_name": "Kasa Smart Wi-Fi Outdoor Plug-In Dimmer",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -66,7 +66,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Test KS200M", "alias": "#MASKED_NAME#",
"dev_name": "Smart Light Switch with PIR", "dev_name": "Smart Light Switch with PIR",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",
"err_code": 0, "err_code": 0,

View File

@ -11,7 +11,7 @@
"stopConnect": 0, "stopConnect": 0,
"tcspInfo": "", "tcspInfo": "",
"tcspStatus": 1, "tcspStatus": 1,
"username": "#MASKED_NAME#" "username": "user@example.com"
}, },
"get_intl_fw_list": { "get_intl_fw_list": {
"err_code": 0, "err_code": 0,

View File

@ -78,7 +78,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Garage Entryway Lights", "alias": "#MASKED_NAME#",
"brightness": 100, "brightness": 100,
"dev_name": "Wi-Fi Smart Dimmer with sensor", "dev_name": "Wi-Fi Smart Dimmer with sensor",
"deviceId": "0000000000000000000000000000000000000000", "deviceId": "0000000000000000000000000000000000000000",

View File

@ -14,7 +14,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "Test KS230", "alias": "#MASKED_NAME#",
"brightness": 60, "brightness": 60,
"dc_state": 0, "dc_state": 0,
"dev_name": "Wi-Fi Smart 3-Way Dimmer", "dev_name": "Wi-Fi Smart 3-Way Dimmer",

View File

@ -21,7 +21,7 @@
"system": { "system": {
"get_sysinfo": { "get_sysinfo": {
"active_mode": "none", "active_mode": "none",
"alias": "TP-LINK_Smart Bulb_43EC", "alias": "#MASKED_NAME#",
"ctrl_protocols": { "ctrl_protocols": {
"name": "Linkie", "name": "Linkie",
"version": "1.0" "version": "1.0"

View File

@ -84,6 +84,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "EP25(US)", "device_model": "EP25(US)",
"device_type": "SMART.KASAPLUG", "device_type": "SMART.KASAPLUG",
@ -99,6 +101,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -88,6 +88,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "EP25(US)", "device_model": "EP25(US)",
"device_type": "SMART.KASAPLUG", "device_type": "SMART.KASAPLUG",
@ -103,6 +105,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -379,6 +379,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "EP40M(US)", "device_model": "EP40M(US)",
"device_type": "SMART.KASAPLUG", "device_type": "SMART.KASAPLUG",
@ -394,6 +396,7 @@
}, },
"obd_src": "matter", "obd_src": "matter",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_auto_update_info": { "get_auto_update_info": {
"enable": true, "enable": true,

View File

@ -84,6 +84,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "H100(EU)", "device_model": "H100(EU)",
"device_type": "SMART.TAPOHUB", "device_type": "SMART.TAPOHUB",
@ -99,6 +101,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "" "owner": ""
}
}, },
"get_auto_update_info": { "get_auto_update_info": {
"enable": true, "enable": true,

View File

@ -96,6 +96,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "H100(EU)", "device_model": "H100(EU)",
"device_type": "SMART.TAPOHUB", "device_type": "SMART.TAPOHUB",
@ -111,6 +113,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_alarm_configure": { "get_alarm_configure": {
"duration": 10, "duration": 10,

View File

@ -92,6 +92,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "H100(EU)", "device_model": "H100(EU)",
"device_type": "SMART.TAPOHUB", "device_type": "SMART.TAPOHUB",
@ -107,6 +109,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_alarm_configure": { "get_alarm_configure": {
"duration": 10, "duration": 10,
@ -195,7 +198,7 @@
"ver_code": 1 "ver_code": 1
} }
], ],
"device_id": "0000000000000000000000000000000000000000" "device_id": "SCRUBBED_CHILD_DEVICE_ID_1"
} }
], ],
"start_index": 0, "start_index": 0,
@ -213,7 +216,7 @@
"current_humidity_exception": -34, "current_humidity_exception": -34,
"current_temp": 22.2, "current_temp": 22.2,
"current_temp_exception": 0, "current_temp_exception": 0,
"device_id": "0000000000000000000000000000000000000000", "device_id": "SCRUBBED_CHILD_DEVICE_ID_1",
"fw_ver": "1.7.0 Build 230424 Rel.170332", "fw_ver": "1.7.0 Build 230424 Rel.170332",
"hw_id": "00000000000000000000000000000000", "hw_id": "00000000000000000000000000000000",
"hw_ver": "1.0", "hw_ver": "1.0",

View File

@ -80,6 +80,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "HS200(US)", "device_model": "HS200(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -95,6 +97,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -100,20 +100,23 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"owner": "00000000000000000000000000000000",
"device_type": "SMART.KASASWITCH",
"device_model": "HS220(US)", "device_model": "HS220(US)",
"ip": "127.0.0.123", "device_type": "SMART.KASASWITCH",
"mac": "24-2F-D0-00-00-00",
"is_support_iot_cloud": true,
"obd_src": "tplink",
"factory_default": false, "factory_default": false,
"ip": "127.0.0.123",
"is_support_iot_cloud": true,
"mac": "24-2F-D0-00-00-00",
"mgt_encrypt_schm": { "mgt_encrypt_schm": {
"is_support_https": false,
"encrypt_type": "AES", "encrypt_type": "AES",
"http_port": 80, "http_port": 80,
"is_support_https": false,
"lv": 2 "lv": 2
},
"obd_src": "tplink",
"owner": "00000000000000000000000000000000"
} }
}, },
"get_antitheft_rules": { "get_antitheft_rules": {

View File

@ -84,6 +84,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KH100(EU)", "device_model": "KH100(EU)",
"device_type": "SMART.KASAHUB", "device_type": "SMART.KASAHUB",
@ -99,6 +101,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_alarm_configure": { "get_alarm_configure": {
"duration": 300, "duration": 300,

View File

@ -88,6 +88,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KH100(EU)", "device_model": "KH100(EU)",
"device_type": "SMART.KASAHUB", "device_type": "SMART.KASAHUB",
@ -103,6 +105,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_alarm_configure": { "get_alarm_configure": {
"duration": 300, "duration": 300,

View File

@ -88,6 +88,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KH100(UK)", "device_model": "KH100(UK)",
"device_type": "SMART.KASAHUB", "device_type": "SMART.KASAHUB",
@ -103,6 +105,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_alarm_configure": { "get_alarm_configure": {
"duration": 300, "duration": 300,

View File

@ -84,6 +84,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KP125M(US)", "device_model": "KP125M(US)",
"device_type": "SMART.KASAPLUG", "device_type": "SMART.KASAPLUG",
@ -99,6 +101,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_current_power": { "get_current_power": {
"current_power": 17 "current_power": 17
@ -124,7 +127,7 @@
"longitude": 0, "longitude": 0,
"mac": "00-00-00-00-00-00", "mac": "00-00-00-00-00-00",
"model": "KP125M", "model": "KP125M",
"nickname": "IyNNQVNLRUROQU1FIyM=", "nickname": "I01BU0tFRF9OQU1FIw==",
"oem_id": "00000000000000000000000000000000", "oem_id": "00000000000000000000000000000000",
"on_time": 5332, "on_time": 5332,
"overheated": false, "overheated": false,
@ -133,7 +136,7 @@
"rssi": -62, "rssi": -62,
"signal_level": 2, "signal_level": 2,
"specs": "", "specs": "",
"ssid": "IyNNQVNLRUROQU1FIyM=", "ssid": "I01BU0tFRF9TU0lEIw==",
"time_diff": -360, "time_diff": -360,
"type": "SMART.KASAPLUG" "type": "SMART.KASAPLUG"
}, },

View File

@ -88,6 +88,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KP125M(US)", "device_model": "KP125M(US)",
"device_type": "SMART.KASAPLUG", "device_type": "SMART.KASAPLUG",
@ -103,6 +105,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -80,6 +80,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS205(US)", "device_model": "KS205(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -95,6 +97,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -76,6 +76,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS205(US)", "device_model": "KS205(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -91,6 +93,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "" "owner": ""
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -96,6 +96,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS225(US)", "device_model": "KS225(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -111,6 +113,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -96,6 +96,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS225(US)", "device_model": "KS225(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -111,6 +113,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "" "owner": ""
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -414,6 +414,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS240(US)", "device_model": "KS240(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -429,6 +431,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_auto_update_info": { "get_auto_update_info": {
"enable": false, "enable": false,

View File

@ -104,6 +104,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS240(US)", "device_model": "KS240(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -119,6 +121,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_auto_update_info": { "get_auto_update_info": {
"enable": false, "enable": false,
@ -206,7 +209,7 @@
"ver_code": 1 "ver_code": 1
} }
], ],
"device_id": "000000000000000000000000000000000000000001" "device_id": "SCRUBBED_CHILD_DEVICE_ID_1"
}, },
{ {
"component_list": [ "component_list": [
@ -267,7 +270,7 @@
"ver_code": 1 "ver_code": 1
} }
], ],
"device_id": "000000000000000000000000000000000000000000" "device_id": "SCRUBBED_CHILD_DEVICE_ID_2"
} }
], ],
"start_index": 0, "start_index": 0,
@ -279,7 +282,7 @@
"avatar": "switch_ks240", "avatar": "switch_ks240",
"bind_count": 1, "bind_count": 1,
"category": "kasa.switch.outlet.sub-fan", "category": "kasa.switch.outlet.sub-fan",
"device_id": "000000000000000000000000000000000000000000", "device_id": "SCRUBBED_CHILD_DEVICE_ID_2",
"device_on": true, "device_on": true,
"fan_sleep_mode_on": false, "fan_sleep_mode_on": false,
"fan_speed_level": 1, "fan_speed_level": 1,
@ -317,7 +320,7 @@
], ],
"type": "last_states" "type": "last_states"
}, },
"device_id": "000000000000000000000000000000000000000001", "device_id": "SCRUBBED_CHILD_DEVICE_ID_1",
"device_on": false, "device_on": false,
"fade_off_time": 1, "fade_off_time": 1,
"fade_on_time": 1, "fade_on_time": 1,

View File

@ -425,6 +425,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "KS240(US)", "device_model": "KS240(US)",
"device_type": "SMART.KASASWITCH", "device_type": "SMART.KASASWITCH",
@ -440,6 +442,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_auto_update_info": { "get_auto_update_info": {
"enable": true, "enable": true,

View File

@ -80,6 +80,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L510B(EU)", "device_model": "L510B(EU)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -95,6 +97,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -80,6 +80,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L510E(US)", "device_model": "L510E(US)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -95,6 +97,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -88,6 +88,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L510E(US)", "device_model": "L510E(US)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -103,6 +105,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -100,6 +100,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L530E(EU)", "device_model": "L530E(EU)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -115,6 +117,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -104,6 +104,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L530E(EU)", "device_model": "L530E(EU)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -119,6 +121,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

View File

@ -104,6 +104,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L530E(EU)", "device_model": "L530E(EU)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -119,6 +121,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,
@ -175,7 +178,7 @@
"longitude": 0, "longitude": 0,
"mac": "5C-E9-31-00-00-00", "mac": "5C-E9-31-00-00-00",
"model": "L530", "model": "L530",
"nickname": "TGl2aW5nIFJvb20gQnVsYg==", "nickname": "I01BU0tFRF9OQU1FIw==",
"oem_id": "00000000000000000000000000000000", "oem_id": "00000000000000000000000000000000",
"overheated": false, "overheated": false,
"region": "Europe/Berlin", "region": "Europe/Berlin",

View File

@ -104,6 +104,8 @@
] ]
}, },
"discovery_result": { "discovery_result": {
"error_code": 0,
"result": {
"device_id": "00000000000000000000000000000000", "device_id": "00000000000000000000000000000000",
"device_model": "L530E(US)", "device_model": "L530E(US)",
"device_type": "SMART.TAPOBULB", "device_type": "SMART.TAPOBULB",
@ -119,6 +121,7 @@
}, },
"obd_src": "tplink", "obd_src": "tplink",
"owner": "00000000000000000000000000000000" "owner": "00000000000000000000000000000000"
}
}, },
"get_antitheft_rules": { "get_antitheft_rules": {
"antitheft_rule_max_count": 1, "antitheft_rule_max_count": 1,

Some files were not shown because too many files have changed in this diff Show More