mirror of
https://github.com/python-kasa/python-kasa.git
synced 2025-07-04 02:29:58 +00:00
Merge remote-tracking branch 'upstream/master' into feat/smartcam_passthrough
This commit is contained in:
commit
7f8f823eac
@ -201,7 +201,7 @@ The following devices have been tested and confirmed as working. If your device
|
|||||||
- **Wall Switches**: S500D, S505, S505D
|
- **Wall Switches**: S500D, S505, S505D
|
||||||
- **Bulbs**: L510B, L510E, L530E, L630
|
- **Bulbs**: L510B, L510E, L530E, L630
|
||||||
- **Light Strips**: L900-10, L900-5, L920-5, L930-5
|
- **Light Strips**: L900-10, L900-5, L920-5, L930-5
|
||||||
- **Cameras**: C210, C520WS, TC65
|
- **Cameras**: C100, C210, C325WB, C520WS, TC65, TC70
|
||||||
- **Hubs**: H100, H200
|
- **Hubs**: H100, H200
|
||||||
- **Hub-Connected Devices[^3]**: S200B, S200D, T100, T110, T300, T310, T315
|
- **Hub-Connected Devices[^3]**: S200B, S200D, T100, T110, T300, T310, T315
|
||||||
|
|
||||||
|
@ -258,13 +258,19 @@ All Tapo devices require authentication.<br>Hub-Connected Devices may work acros
|
|||||||
|
|
||||||
### Cameras
|
### Cameras
|
||||||
|
|
||||||
|
- **C100**
|
||||||
|
- Hardware: 4.0 / Firmware: 1.3.14
|
||||||
- **C210**
|
- **C210**
|
||||||
- Hardware: 2.0 (EU) / Firmware: 1.4.2
|
- Hardware: 2.0 (EU) / Firmware: 1.4.2
|
||||||
- Hardware: 2.0 (EU) / Firmware: 1.4.3
|
- Hardware: 2.0 (EU) / Firmware: 1.4.3
|
||||||
|
- **C325WB**
|
||||||
|
- Hardware: 1.0 (EU) / Firmware: 1.1.17
|
||||||
- **C520WS**
|
- **C520WS**
|
||||||
- Hardware: 1.0 (US) / Firmware: 1.2.8
|
- Hardware: 1.0 (US) / Firmware: 1.2.8
|
||||||
- **TC65**
|
- **TC65**
|
||||||
- Hardware: 1.0 / Firmware: 1.3.9
|
- Hardware: 1.0 / Firmware: 1.3.9
|
||||||
|
- **TC70**
|
||||||
|
- Hardware: 3.0 / Firmware: 1.3.11
|
||||||
|
|
||||||
### Hubs
|
### Hubs
|
||||||
|
|
||||||
|
@ -123,14 +123,19 @@ async def list(ctx):
|
|||||||
async def print_discovered(dev: Device):
|
async def print_discovered(dev: Device):
|
||||||
cparams = dev.config.connection_type
|
cparams = dev.config.connection_type
|
||||||
infostr = (
|
infostr = (
|
||||||
f"{dev.host:<15} {cparams.device_family.value:<20} "
|
f"{dev.host:<15} {dev.model:<9} {cparams.device_family.value:<20} "
|
||||||
f"{cparams.encryption_type.value:<7}"
|
f"{cparams.encryption_type.value:<7} {cparams.https:<5} "
|
||||||
|
f"{cparams.login_version or '-':<3}"
|
||||||
)
|
)
|
||||||
async with sem:
|
async with sem:
|
||||||
try:
|
try:
|
||||||
await dev.update()
|
await dev.update()
|
||||||
except AuthenticationError:
|
except AuthenticationError:
|
||||||
echo(f"{infostr} - Authentication failed")
|
echo(f"{infostr} - Authentication failed")
|
||||||
|
except TimeoutError:
|
||||||
|
echo(f"{infostr} - Timed out")
|
||||||
|
except Exception as ex:
|
||||||
|
echo(f"{infostr} - Error: {ex}")
|
||||||
else:
|
else:
|
||||||
echo(f"{infostr} {dev.alias}")
|
echo(f"{infostr} {dev.alias}")
|
||||||
|
|
||||||
@ -138,7 +143,10 @@ async def list(ctx):
|
|||||||
if host := unsupported_exception.host:
|
if host := unsupported_exception.host:
|
||||||
echo(f"{host:<15} UNSUPPORTED DEVICE")
|
echo(f"{host:<15} UNSUPPORTED DEVICE")
|
||||||
|
|
||||||
echo(f"{'HOST':<15} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} {'ALIAS'}")
|
echo(
|
||||||
|
f"{'HOST':<15} {'MODEL':<9} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} "
|
||||||
|
f"{'HTTPS':<5} {'LV':<3} {'ALIAS'}"
|
||||||
|
)
|
||||||
return await _discover(
|
return await _discover(
|
||||||
ctx,
|
ctx,
|
||||||
print_discovered=print_discovered,
|
print_discovered=print_discovered,
|
||||||
|
@ -159,6 +159,7 @@ class Module(ABC):
|
|||||||
|
|
||||||
# SMARTCAM only modules
|
# SMARTCAM only modules
|
||||||
Camera: Final[ModuleName[smartcam.Camera]] = ModuleName("Camera")
|
Camera: Final[ModuleName[smartcam.Camera]] = ModuleName("Camera")
|
||||||
|
LensMask: Final[ModuleName[smartcam.LensMask]] = ModuleName("LensMask")
|
||||||
|
|
||||||
def __init__(self, device: Device, module: str) -> None:
|
def __init__(self, device: Device, module: str) -> None:
|
||||||
self._device = device
|
self._device = device
|
||||||
|
@ -6,6 +6,7 @@ from .childdevice import ChildDevice
|
|||||||
from .device import DeviceModule
|
from .device import DeviceModule
|
||||||
from .homekit import HomeKit
|
from .homekit import HomeKit
|
||||||
from .led import Led
|
from .led import Led
|
||||||
|
from .lensmask import LensMask
|
||||||
from .matter import Matter
|
from .matter import Matter
|
||||||
from .pantilt import PanTilt
|
from .pantilt import PanTilt
|
||||||
from .time import Time
|
from .time import Time
|
||||||
@ -20,4 +21,5 @@ __all__ = [
|
|||||||
"Time",
|
"Time",
|
||||||
"HomeKit",
|
"HomeKit",
|
||||||
"Matter",
|
"Matter",
|
||||||
|
"LensMask",
|
||||||
]
|
]
|
||||||
|
@ -1,16 +1,18 @@
|
|||||||
"""Implementation of device module."""
|
"""Implementation of camera module."""
|
||||||
|
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
import base64
|
import base64
|
||||||
import logging
|
import logging
|
||||||
from enum import StrEnum
|
from enum import StrEnum
|
||||||
|
from typing import Annotated
|
||||||
from urllib.parse import quote_plus
|
from urllib.parse import quote_plus
|
||||||
|
|
||||||
from ...credentials import Credentials
|
from ...credentials import Credentials
|
||||||
from ...device_type import DeviceType
|
from ...device_type import DeviceType
|
||||||
from ...feature import Feature
|
from ...feature import Feature
|
||||||
from ...json import loads as json_loads
|
from ...json import loads as json_loads
|
||||||
|
from ...module import FeatureAttribute, Module
|
||||||
from ..smartcammodule import SmartCamModule
|
from ..smartcammodule import SmartCamModule
|
||||||
|
|
||||||
_LOGGER = logging.getLogger(__name__)
|
_LOGGER = logging.getLogger(__name__)
|
||||||
@ -29,28 +31,38 @@ class StreamResolution(StrEnum):
|
|||||||
class Camera(SmartCamModule):
|
class Camera(SmartCamModule):
|
||||||
"""Implementation of device module."""
|
"""Implementation of device module."""
|
||||||
|
|
||||||
QUERY_GETTER_NAME = "getLensMaskConfig"
|
|
||||||
QUERY_MODULE_NAME = "lens_mask"
|
|
||||||
QUERY_SECTION_NAMES = "lens_mask_info"
|
|
||||||
|
|
||||||
def _initialize_features(self) -> None:
|
def _initialize_features(self) -> None:
|
||||||
"""Initialize features after the initial update."""
|
"""Initialize features after the initial update."""
|
||||||
self._add_feature(
|
if Module.LensMask in self._device.modules:
|
||||||
Feature(
|
self._add_feature(
|
||||||
self._device,
|
Feature(
|
||||||
id="state",
|
self._device,
|
||||||
name="State",
|
id="state",
|
||||||
attribute_getter="is_on",
|
name="State",
|
||||||
attribute_setter="set_state",
|
container=self,
|
||||||
type=Feature.Type.Switch,
|
attribute_getter="is_on",
|
||||||
category=Feature.Category.Primary,
|
attribute_setter="set_state",
|
||||||
|
type=Feature.Type.Switch,
|
||||||
|
category=Feature.Category.Primary,
|
||||||
|
)
|
||||||
)
|
)
|
||||||
)
|
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def is_on(self) -> bool:
|
def is_on(self) -> bool:
|
||||||
"""Return the device id."""
|
"""Return the device on state."""
|
||||||
return self.data["lens_mask_info"]["enabled"] == "off"
|
if lens_mask := self._device.modules.get(Module.LensMask):
|
||||||
|
return not lens_mask.enabled
|
||||||
|
return True
|
||||||
|
|
||||||
|
async def set_state(self, on: bool) -> Annotated[dict, FeatureAttribute()]:
|
||||||
|
"""Set the device on state.
|
||||||
|
|
||||||
|
If the device does not support setting state will do nothing.
|
||||||
|
"""
|
||||||
|
if lens_mask := self._device.modules.get(Module.LensMask):
|
||||||
|
# Turning off enables the privacy mask which is why value is reversed.
|
||||||
|
return await lens_mask.set_enabled(not on)
|
||||||
|
return {}
|
||||||
|
|
||||||
def _get_credentials(self) -> Credentials | None:
|
def _get_credentials(self) -> Credentials | None:
|
||||||
"""Get credentials from ."""
|
"""Get credentials from ."""
|
||||||
@ -109,14 +121,6 @@ class Camera(SmartCamModule):
|
|||||||
"""Return the onvif url."""
|
"""Return the onvif url."""
|
||||||
return f"http://{self._device.host}:{ONVIF_PORT}/onvif/device_service"
|
return f"http://{self._device.host}:{ONVIF_PORT}/onvif/device_service"
|
||||||
|
|
||||||
async def set_state(self, on: bool) -> dict:
|
|
||||||
"""Set the device state."""
|
|
||||||
# Turning off enables the privacy mask which is why value is reversed.
|
|
||||||
params = {"enabled": "off" if on else "on"}
|
|
||||||
return await self._device._query_setter_helper(
|
|
||||||
"setLensMaskConfig", self.QUERY_MODULE_NAME, "lens_mask_info", params
|
|
||||||
)
|
|
||||||
|
|
||||||
async def _check_supported(self) -> bool:
|
async def _check_supported(self) -> bool:
|
||||||
"""Additional check to see if the module is supported by the device."""
|
"""Additional check to see if the module is supported by the device."""
|
||||||
return self._device.device_type is DeviceType.Camera
|
return self._device.device_type is DeviceType.Camera
|
||||||
|
31
kasa/smartcam/modules/lensmask.py
Normal file
31
kasa/smartcam/modules/lensmask.py
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
"""Implementation of lens mask privacy module."""
|
||||||
|
|
||||||
|
from __future__ import annotations
|
||||||
|
|
||||||
|
import logging
|
||||||
|
|
||||||
|
from ..smartcammodule import SmartCamModule
|
||||||
|
|
||||||
|
_LOGGER = logging.getLogger(__name__)
|
||||||
|
|
||||||
|
|
||||||
|
class LensMask(SmartCamModule):
|
||||||
|
"""Implementation of lens mask module."""
|
||||||
|
|
||||||
|
REQUIRED_COMPONENT = "lensMask"
|
||||||
|
|
||||||
|
QUERY_GETTER_NAME = "getLensMaskConfig"
|
||||||
|
QUERY_MODULE_NAME = "lens_mask"
|
||||||
|
QUERY_SECTION_NAMES = "lens_mask_info"
|
||||||
|
|
||||||
|
@property
|
||||||
|
def enabled(self) -> bool:
|
||||||
|
"""Return the lens mask state."""
|
||||||
|
return self.data["lens_mask_info"]["enabled"] == "on"
|
||||||
|
|
||||||
|
async def set_enabled(self, enable: bool) -> dict:
|
||||||
|
"""Set the lens mask state."""
|
||||||
|
params = {"enabled": "on" if enable else "off"}
|
||||||
|
return await self._device._query_setter_helper(
|
||||||
|
"setLensMaskConfig", self.QUERY_MODULE_NAME, "lens_mask_info", params
|
||||||
|
)
|
@ -134,6 +134,11 @@ class SmartCamDevice(SmartDevice):
|
|||||||
if (
|
if (
|
||||||
mod.REQUIRED_COMPONENT
|
mod.REQUIRED_COMPONENT
|
||||||
and mod.REQUIRED_COMPONENT not in self._components
|
and mod.REQUIRED_COMPONENT not in self._components
|
||||||
|
# Always add Camera module to cameras
|
||||||
|
and (
|
||||||
|
mod._module_name() != Module.Camera
|
||||||
|
or self._device_type is not DeviceType.Camera
|
||||||
|
)
|
||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
module = mod(self, mod._module_name())
|
module = mod(self, mod._module_name())
|
||||||
|
@ -160,6 +160,17 @@ def create_discovery_mock(ip: str, fixture_data: dict):
|
|||||||
login_version: int | None = None
|
login_version: int | None = None
|
||||||
port_override: int | None = None
|
port_override: int | None = None
|
||||||
|
|
||||||
|
@property
|
||||||
|
def model(self) -> str:
|
||||||
|
dd = self.discovery_data
|
||||||
|
model_region = (
|
||||||
|
dd["result"]["device_model"]
|
||||||
|
if self.discovery_port == 20002
|
||||||
|
else dd["system"]["get_sysinfo"]["model"]
|
||||||
|
)
|
||||||
|
model, _, _ = model_region.partition("(")
|
||||||
|
return model
|
||||||
|
|
||||||
@property
|
@property
|
||||||
def _datagram(self) -> bytes:
|
def _datagram(self) -> bytes:
|
||||||
if self.default_port == 9999:
|
if self.default_port == 9999:
|
||||||
@ -178,7 +189,10 @@ def create_discovery_mock(ip: str, fixture_data: dict):
|
|||||||
"encrypt_type", discovery_result.get("encrypt_info", {}).get("sym_schm")
|
"encrypt_type", discovery_result.get("encrypt_info", {}).get("sym_schm")
|
||||||
)
|
)
|
||||||
|
|
||||||
login_version = discovery_result["mgt_encrypt_schm"].get("lv")
|
if not (login_version := discovery_result["mgt_encrypt_schm"].get("lv")) and (
|
||||||
|
et := discovery_result.get("encrypt_type")
|
||||||
|
):
|
||||||
|
login_version = max([int(i) for i in et])
|
||||||
https = discovery_result["mgt_encrypt_schm"]["is_support_https"]
|
https = discovery_result["mgt_encrypt_schm"]["is_support_https"]
|
||||||
dm = _DiscoveryMock(
|
dm = _DiscoveryMock(
|
||||||
ip,
|
ip,
|
||||||
|
779
tests/fixtures/smartcam/C100_4.0_1.3.14.json
vendored
Normal file
779
tests/fixtures/smartcam/C100_4.0_1.3.14.json
vendored
Normal file
@ -0,0 +1,779 @@
|
|||||||
|
{
|
||||||
|
"discovery_result": {
|
||||||
|
"error_code": 0,
|
||||||
|
"result": {
|
||||||
|
"decrypted_data": {
|
||||||
|
"connect_ssid": "#MASKED_SSID#",
|
||||||
|
"connect_type": "wireless",
|
||||||
|
"device_id": "0000000000000000000000000000000000000000",
|
||||||
|
"http_port": 443,
|
||||||
|
"owner": "00000000000000000000000000000000",
|
||||||
|
"sd_status": "offline"
|
||||||
|
},
|
||||||
|
"device_id": "00000000000000000000000000000000",
|
||||||
|
"device_model": "C100",
|
||||||
|
"device_name": "#MASKED_NAME#",
|
||||||
|
"device_type": "SMART.IPCAMERA",
|
||||||
|
"encrypt_info": {
|
||||||
|
"data": "",
|
||||||
|
"key": "",
|
||||||
|
"sym_schm": "AES"
|
||||||
|
},
|
||||||
|
"encrypt_type": [
|
||||||
|
"3"
|
||||||
|
],
|
||||||
|
"factory_default": false,
|
||||||
|
"firmware_version": "1.3.14 Build 240513 Rel.43631n(5553)",
|
||||||
|
"hardware_version": "4.0",
|
||||||
|
"ip": "127.0.0.123",
|
||||||
|
"is_support_iot_cloud": true,
|
||||||
|
"mac": "F0-A7-31-00-00-00",
|
||||||
|
"mgt_encrypt_schm": {
|
||||||
|
"is_support_https": true
|
||||||
|
},
|
||||||
|
"protocol_version": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getAlertPlan": {
|
||||||
|
"msg_alarm_plan": {
|
||||||
|
"chn1_msg_alarm_plan": {
|
||||||
|
".name": "chn1_msg_alarm_plan",
|
||||||
|
".type": "plan",
|
||||||
|
"alarm_plan_1": "0000-0000,127",
|
||||||
|
"enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getAppComponentList": {
|
||||||
|
"app_component": {
|
||||||
|
"app_component_list": [
|
||||||
|
{
|
||||||
|
"name": "sdCard",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "timezone",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "system",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "led",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "playback",
|
||||||
|
"version": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "detection",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "alert",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "firmware",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "account",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "quickSetup",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "video",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lensMask",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lightFrequency",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dayNightMode",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "osd",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "record",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "videoRotation",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "audio",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "diagnose",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "msgPush",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "deviceShare",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tapoCare",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockZone",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "personDetection",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "babyCryDetection",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "needSubscriptionServiceList",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "iotCloud",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "recordDownload",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "detectionRegion",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "staticIp",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getAudioConfig": {
|
||||||
|
"audio_config": {
|
||||||
|
"microphone": {
|
||||||
|
".name": "microphone",
|
||||||
|
".type": "audio_config",
|
||||||
|
"channels": "1",
|
||||||
|
"encode_type": "G711alaw",
|
||||||
|
"mute": "off",
|
||||||
|
"noise_cancelling": "on",
|
||||||
|
"sampling_rate": "8",
|
||||||
|
"volume": "100"
|
||||||
|
},
|
||||||
|
"speaker": {
|
||||||
|
".name": "speaker",
|
||||||
|
".type": "audio_config",
|
||||||
|
"volume": "40"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getBCDConfig": {
|
||||||
|
"sound_detection": {
|
||||||
|
"bcd": {
|
||||||
|
".name": "bcd",
|
||||||
|
".type": "on_off",
|
||||||
|
"digital_sensitivity": "50",
|
||||||
|
"enabled": "off",
|
||||||
|
"sensitivity": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getCircularRecordingConfig": {
|
||||||
|
"harddisk_manage": {
|
||||||
|
"harddisk": {
|
||||||
|
".name": "harddisk",
|
||||||
|
".type": "storage",
|
||||||
|
"loop": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getClockStatus": {
|
||||||
|
"system": {
|
||||||
|
"clock_status": {
|
||||||
|
"local_time": "2024-12-15 11:11:55",
|
||||||
|
"seconds_from_1970": 1734279115
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getConnectionType": {
|
||||||
|
"link_type": "wifi",
|
||||||
|
"rssi": "4",
|
||||||
|
"rssiValue": -15,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
"getDetectionConfig": {
|
||||||
|
"motion_detection": {
|
||||||
|
"motion_det": {
|
||||||
|
".name": "motion_det",
|
||||||
|
".type": "on_off",
|
||||||
|
"digital_sensitivity": "50",
|
||||||
|
"enabled": "off",
|
||||||
|
"sensitivity": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getDeviceInfo": {
|
||||||
|
"device_info": {
|
||||||
|
"basic_info": {
|
||||||
|
"avatar": "camera c100",
|
||||||
|
"barcode": "",
|
||||||
|
"dev_id": "0000000000000000000000000000000000000000",
|
||||||
|
"device_alias": "#MASKED_NAME#",
|
||||||
|
"device_info": "C100 4.0 IPC",
|
||||||
|
"device_model": "C100",
|
||||||
|
"device_name": "#MASKED_NAME#",
|
||||||
|
"device_type": "SMART.IPCAMERA",
|
||||||
|
"features": "3",
|
||||||
|
"ffs": false,
|
||||||
|
"has_set_location_info": 1,
|
||||||
|
"hw_desc": "00000000000000000000000000000000",
|
||||||
|
"hw_version": "4.0",
|
||||||
|
"is_cal": true,
|
||||||
|
"latitude": 0,
|
||||||
|
"longitude": 0,
|
||||||
|
"mac": "F0-A7-31-00-00-00",
|
||||||
|
"oem_id": "00000000000000000000000000000000",
|
||||||
|
"sw_version": "1.3.14 Build 240513 Rel.43631n(5553)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getFirmwareAutoUpgradeConfig": {
|
||||||
|
"auto_upgrade": {
|
||||||
|
"common": {
|
||||||
|
".name": "common",
|
||||||
|
".type": "on_off",
|
||||||
|
"enabled": "off",
|
||||||
|
"random_range": "120",
|
||||||
|
"time": "03:00"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getFirmwareUpdateStatus": {
|
||||||
|
"cloud_config": {
|
||||||
|
"upgrade_status": {
|
||||||
|
"lastUpgradingSuccess": true,
|
||||||
|
"state": "normal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLastAlarmInfo": {
|
||||||
|
"system": {
|
||||||
|
"last_alarm_info": {
|
||||||
|
"last_alarm_time": "",
|
||||||
|
"last_alarm_type": ""
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLdc": {
|
||||||
|
"image": {
|
||||||
|
"common": {
|
||||||
|
".name": "common",
|
||||||
|
".type": "para",
|
||||||
|
"area_compensation": "default",
|
||||||
|
"chroma": "50",
|
||||||
|
"contrast": "50",
|
||||||
|
"dehaze": "off",
|
||||||
|
"exp_gain": "0",
|
||||||
|
"exp_type": "auto",
|
||||||
|
"focus_limited": "600",
|
||||||
|
"focus_type": "semi_auto",
|
||||||
|
"high_light_compensation": "off",
|
||||||
|
"inf_delay": "10",
|
||||||
|
"inf_end_time": "21600",
|
||||||
|
"inf_sensitivity": "1",
|
||||||
|
"inf_start_time": "64800",
|
||||||
|
"inf_type": "auto",
|
||||||
|
"light_freq_mode": "auto",
|
||||||
|
"lock_blue_colton": "0",
|
||||||
|
"lock_blue_gain": "0",
|
||||||
|
"lock_gb_gain": "0",
|
||||||
|
"lock_gr_gain": "0",
|
||||||
|
"lock_green_colton": "0",
|
||||||
|
"lock_red_colton": "0",
|
||||||
|
"lock_red_gain": "0",
|
||||||
|
"lock_source": "local",
|
||||||
|
"luma": "50",
|
||||||
|
"saturation": "50",
|
||||||
|
"sharpness": "50",
|
||||||
|
"shutter": "1/25",
|
||||||
|
"smartir": "off",
|
||||||
|
"smartir_level": "100",
|
||||||
|
"wb_B_gain": "50",
|
||||||
|
"wb_G_gain": "50",
|
||||||
|
"wb_R_gain": "50",
|
||||||
|
"wb_type": "auto",
|
||||||
|
"wd_gain": "50",
|
||||||
|
"wide_dynamic": "off"
|
||||||
|
},
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLedStatus": {
|
||||||
|
"led": {
|
||||||
|
"config": {
|
||||||
|
".name": "config",
|
||||||
|
".type": "led",
|
||||||
|
"enabled": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLensMaskConfig": {
|
||||||
|
"lens_mask": {
|
||||||
|
"lens_mask_info": {
|
||||||
|
".name": "lens_mask_info",
|
||||||
|
".type": "lens_mask_info",
|
||||||
|
"enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLightFrequencyInfo": {
|
||||||
|
"image": {
|
||||||
|
"common": {
|
||||||
|
".name": "common",
|
||||||
|
".type": "para",
|
||||||
|
"area_compensation": "default",
|
||||||
|
"chroma": "50",
|
||||||
|
"contrast": "50",
|
||||||
|
"dehaze": "off",
|
||||||
|
"exp_gain": "0",
|
||||||
|
"exp_type": "auto",
|
||||||
|
"focus_limited": "600",
|
||||||
|
"focus_type": "semi_auto",
|
||||||
|
"high_light_compensation": "off",
|
||||||
|
"inf_delay": "10",
|
||||||
|
"inf_end_time": "21600",
|
||||||
|
"inf_sensitivity": "1",
|
||||||
|
"inf_start_time": "64800",
|
||||||
|
"inf_type": "auto",
|
||||||
|
"light_freq_mode": "auto",
|
||||||
|
"lock_blue_colton": "0",
|
||||||
|
"lock_blue_gain": "0",
|
||||||
|
"lock_gb_gain": "0",
|
||||||
|
"lock_gr_gain": "0",
|
||||||
|
"lock_green_colton": "0",
|
||||||
|
"lock_red_colton": "0",
|
||||||
|
"lock_red_gain": "0",
|
||||||
|
"lock_source": "local",
|
||||||
|
"luma": "50",
|
||||||
|
"saturation": "50",
|
||||||
|
"sharpness": "50",
|
||||||
|
"shutter": "1/25",
|
||||||
|
"smartir": "off",
|
||||||
|
"smartir_level": "100",
|
||||||
|
"wb_B_gain": "50",
|
||||||
|
"wb_G_gain": "50",
|
||||||
|
"wb_R_gain": "50",
|
||||||
|
"wb_type": "auto",
|
||||||
|
"wd_gain": "50",
|
||||||
|
"wide_dynamic": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getMediaEncrypt": {
|
||||||
|
"cet": {
|
||||||
|
"media_encrypt": {
|
||||||
|
".name": "media_encrypt",
|
||||||
|
".type": "on_off",
|
||||||
|
"enabled": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getMsgPushConfig": {
|
||||||
|
"msg_push": {
|
||||||
|
"chn1_msg_push_info": {
|
||||||
|
".name": "chn1_msg_push_info",
|
||||||
|
".type": "on_off",
|
||||||
|
"notification_enabled": "off",
|
||||||
|
"rich_notification_enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getNightVisionModeConfig": {
|
||||||
|
"image": {
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getPersonDetectionConfig": {
|
||||||
|
"people_detection": {
|
||||||
|
"detection": {
|
||||||
|
".name": "detection",
|
||||||
|
".type": "on_off",
|
||||||
|
"enabled": "off",
|
||||||
|
"sensitivity": "60"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getRecordPlan": {
|
||||||
|
"record_plan": {
|
||||||
|
"chn1_channel": {
|
||||||
|
".name": "chn1_channel",
|
||||||
|
".type": "plan",
|
||||||
|
"enabled": "on",
|
||||||
|
"friday": "[\"0000-2400:2\"]",
|
||||||
|
"monday": "[\"0000-2400:2\"]",
|
||||||
|
"saturday": "[\"0000-2400:2\"]",
|
||||||
|
"sunday": "[\"0000-2400:2\"]",
|
||||||
|
"thursday": "[\"0000-2400:2\"]",
|
||||||
|
"tuesday": "[\"0000-2400:2\"]",
|
||||||
|
"wednesday": "[\"0000-2400:2\"]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getRotationStatus": {
|
||||||
|
"image": {
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getSdCardStatus": {
|
||||||
|
"harddisk_manage": {
|
||||||
|
"hd_info": [
|
||||||
|
{
|
||||||
|
"hd_info_1": {
|
||||||
|
"detect_status": "offline",
|
||||||
|
"disk_name": "1",
|
||||||
|
"free_space": "0B",
|
||||||
|
"loop_record_status": "0",
|
||||||
|
"msg_push_free_space": "0B",
|
||||||
|
"msg_push_total_space": "0B",
|
||||||
|
"percent": "0",
|
||||||
|
"picture_free_space": "0B",
|
||||||
|
"picture_total_space": "0B",
|
||||||
|
"record_duration": "0",
|
||||||
|
"record_free_duration": "0",
|
||||||
|
"record_start_time": "0",
|
||||||
|
"rw_attr": "r",
|
||||||
|
"status": "offline",
|
||||||
|
"total_space": "0B",
|
||||||
|
"type": "local",
|
||||||
|
"video_free_space": "0B",
|
||||||
|
"video_total_space": "0B",
|
||||||
|
"write_protect": "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getTamperDetectionConfig": {
|
||||||
|
"tamper_detection": {
|
||||||
|
"tamper_det": {
|
||||||
|
".name": "tamper_det",
|
||||||
|
".type": "on_off",
|
||||||
|
"digital_sensitivity": "50",
|
||||||
|
"enabled": "off",
|
||||||
|
"sensitivity": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getTimezone": {
|
||||||
|
"system": {
|
||||||
|
"basic": {
|
||||||
|
".name": "basic",
|
||||||
|
".type": "setting",
|
||||||
|
"timezone": "UTC-05:00",
|
||||||
|
"timing_mode": "manual",
|
||||||
|
"zone_id": "America/New_York"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getVideoCapability": {
|
||||||
|
"video_capability": {
|
||||||
|
"main": {
|
||||||
|
".name": "main",
|
||||||
|
".type": "capability",
|
||||||
|
"bitrate_types": [
|
||||||
|
"cbr",
|
||||||
|
"vbr"
|
||||||
|
],
|
||||||
|
"bitrates": [
|
||||||
|
"256",
|
||||||
|
"512",
|
||||||
|
"1024",
|
||||||
|
"2048"
|
||||||
|
],
|
||||||
|
"encode_types": [
|
||||||
|
"H264"
|
||||||
|
],
|
||||||
|
"frame_rates": [
|
||||||
|
"65537",
|
||||||
|
"65546",
|
||||||
|
"65551"
|
||||||
|
],
|
||||||
|
"qualitys": [
|
||||||
|
"1",
|
||||||
|
"3",
|
||||||
|
"5"
|
||||||
|
],
|
||||||
|
"resolutions": [
|
||||||
|
"1920*1080",
|
||||||
|
"1280*720",
|
||||||
|
"640*360"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getVideoQualities": {
|
||||||
|
"video": {
|
||||||
|
"main": {
|
||||||
|
".name": "main",
|
||||||
|
".type": "stream",
|
||||||
|
"bitrate": "1024",
|
||||||
|
"bitrate_type": "vbr",
|
||||||
|
"encode_type": "H264",
|
||||||
|
"frame_rate": "65551",
|
||||||
|
"gop_factor": "2",
|
||||||
|
"name": "VideoEncoder_1",
|
||||||
|
"quality": "3",
|
||||||
|
"resolution": "1920*1080",
|
||||||
|
"stream_type": "general"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getWhitelampConfig": {
|
||||||
|
"image": {
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getWhitelampStatus": {
|
||||||
|
"rest_time": 0,
|
||||||
|
"status": 0
|
||||||
|
},
|
||||||
|
"get_audio_capability": {
|
||||||
|
"get": {
|
||||||
|
"audio_capability": {
|
||||||
|
"device_microphone": {
|
||||||
|
".name": "device_microphone",
|
||||||
|
".type": "capability",
|
||||||
|
"aec": "1",
|
||||||
|
"channels": "1",
|
||||||
|
"echo_cancelling": "0",
|
||||||
|
"encode_type": [
|
||||||
|
"G711alaw"
|
||||||
|
],
|
||||||
|
"half_duplex": "1",
|
||||||
|
"mute": "1",
|
||||||
|
"noise_cancelling": "1",
|
||||||
|
"sampling_rate": [
|
||||||
|
"8"
|
||||||
|
],
|
||||||
|
"volume": "1"
|
||||||
|
},
|
||||||
|
"device_speaker": {
|
||||||
|
".name": "device_speaker",
|
||||||
|
".type": "capability",
|
||||||
|
"channels": "1",
|
||||||
|
"decode_type": [
|
||||||
|
"G711"
|
||||||
|
],
|
||||||
|
"mute": "0",
|
||||||
|
"sampling_rate": [
|
||||||
|
"8"
|
||||||
|
],
|
||||||
|
"volume": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_audio_config": {
|
||||||
|
"get": {
|
||||||
|
"audio_config": {
|
||||||
|
"microphone": {
|
||||||
|
".name": "microphone",
|
||||||
|
".type": "audio_config",
|
||||||
|
"channels": "1",
|
||||||
|
"encode_type": "G711alaw",
|
||||||
|
"mute": "off",
|
||||||
|
"noise_cancelling": "on",
|
||||||
|
"sampling_rate": "8",
|
||||||
|
"volume": "100"
|
||||||
|
},
|
||||||
|
"speaker": {
|
||||||
|
".name": "speaker",
|
||||||
|
".type": "audio_config",
|
||||||
|
"volume": "40"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_cet": {
|
||||||
|
"get": {
|
||||||
|
"cet": {
|
||||||
|
"vhttpd": {
|
||||||
|
".name": "vhttpd",
|
||||||
|
".type": "server",
|
||||||
|
"port": "8800"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_function": {
|
||||||
|
"get": {
|
||||||
|
"function": {
|
||||||
|
"module_spec": {
|
||||||
|
".name": "module_spec",
|
||||||
|
".type": "module-spec",
|
||||||
|
"ae_weighting_table_resolution": "5*5",
|
||||||
|
"ai_enhance_capability": "1",
|
||||||
|
"app_version": "1.0.0",
|
||||||
|
"audio": [
|
||||||
|
"speaker",
|
||||||
|
"microphone"
|
||||||
|
],
|
||||||
|
"audioexception_detection": "0",
|
||||||
|
"auth_encrypt": "1",
|
||||||
|
"backlight_coexistence": "1",
|
||||||
|
"change_password": "1",
|
||||||
|
"client_info": "1",
|
||||||
|
"cloud_storage_version": "1.0",
|
||||||
|
"custom_area_compensation": "1",
|
||||||
|
"custom_auto_mode_exposure_level": "0",
|
||||||
|
"device_share": [
|
||||||
|
"preview",
|
||||||
|
"playback",
|
||||||
|
"voice",
|
||||||
|
"cloud_storage"
|
||||||
|
],
|
||||||
|
"download": [
|
||||||
|
"video"
|
||||||
|
],
|
||||||
|
"events": [
|
||||||
|
"motion",
|
||||||
|
"tamper"
|
||||||
|
],
|
||||||
|
"greeter": "1.0",
|
||||||
|
"http_system_state_audio_support": "1",
|
||||||
|
"intrusion_detection": "1",
|
||||||
|
"led": "1",
|
||||||
|
"lens_mask": "1",
|
||||||
|
"linecrossing_detection": "1",
|
||||||
|
"linkage_capability": "1",
|
||||||
|
"local_storage": "1",
|
||||||
|
"media_encrypt": "1",
|
||||||
|
"msg_alarm": "1",
|
||||||
|
"msg_alarm_list": [
|
||||||
|
"sound",
|
||||||
|
"light"
|
||||||
|
],
|
||||||
|
"msg_alarm_separate_list": [
|
||||||
|
"light",
|
||||||
|
"sound"
|
||||||
|
],
|
||||||
|
"msg_push": "1",
|
||||||
|
"multi_user": "0",
|
||||||
|
"multicast": "0",
|
||||||
|
"network": [
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"ota_upgrade": "1",
|
||||||
|
"p2p_support_versions": [
|
||||||
|
"1.1"
|
||||||
|
],
|
||||||
|
"playback": [
|
||||||
|
"local",
|
||||||
|
"p2p",
|
||||||
|
"relay"
|
||||||
|
],
|
||||||
|
"playback_scale": "1",
|
||||||
|
"preview": [
|
||||||
|
"local",
|
||||||
|
"p2p",
|
||||||
|
"relay"
|
||||||
|
],
|
||||||
|
"privacy_mask_api_version": "1.0",
|
||||||
|
"record_max_slot_cnt": "10",
|
||||||
|
"record_type": [
|
||||||
|
"timing",
|
||||||
|
"motion"
|
||||||
|
],
|
||||||
|
"relay_support_versions": [
|
||||||
|
"1.3"
|
||||||
|
],
|
||||||
|
"reonboarding": "1",
|
||||||
|
"smart_detection": "1",
|
||||||
|
"smart_msg_push_capability": "1",
|
||||||
|
"ssl_cer_version": "1.0",
|
||||||
|
"storage_api_version": "2.2",
|
||||||
|
"stream_max_sessions": "10",
|
||||||
|
"streaming_support_versions": [
|
||||||
|
"1.0"
|
||||||
|
],
|
||||||
|
"target_track": "0",
|
||||||
|
"timing_reboot": "1",
|
||||||
|
"verification_change_password": "1",
|
||||||
|
"video_codec": [
|
||||||
|
"h264"
|
||||||
|
],
|
||||||
|
"video_detection_digital_sensitivity": "1",
|
||||||
|
"wifi_cascade_connection": "1",
|
||||||
|
"wifi_connection_info": "1",
|
||||||
|
"wireless_hotspot": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
1065
tests/fixtures/smartcam/C325WB(EU)_1.0_1.1.17.json
vendored
Normal file
1065
tests/fixtures/smartcam/C325WB(EU)_1.0_1.1.17.json
vendored
Normal file
File diff suppressed because it is too large
Load Diff
135
tests/fixtures/smartcam/C520WS(US)_1.0_1.2.8.json
vendored
135
tests/fixtures/smartcam/C520WS(US)_1.0_1.2.8.json
vendored
@ -7,8 +7,8 @@
|
|||||||
"connect_type": "wireless",
|
"connect_type": "wireless",
|
||||||
"device_id": "0000000000000000000000000000000000000000",
|
"device_id": "0000000000000000000000000000000000000000",
|
||||||
"http_port": 443,
|
"http_port": 443,
|
||||||
"last_alarm_time": "0",
|
"last_alarm_time": "1734386954",
|
||||||
"last_alarm_type": "",
|
"last_alarm_type": "motion",
|
||||||
"owner": "00000000000000000000000000000000",
|
"owner": "00000000000000000000000000000000",
|
||||||
"sd_status": "offline"
|
"sd_status": "offline"
|
||||||
},
|
},
|
||||||
@ -283,15 +283,22 @@
|
|||||||
"getClockStatus": {
|
"getClockStatus": {
|
||||||
"system": {
|
"system": {
|
||||||
"clock_status": {
|
"clock_status": {
|
||||||
"local_time": "2024-12-02 13:12:15",
|
"local_time": "2024-12-16 17:09:43",
|
||||||
"seconds_from_1970": 1733163135
|
"seconds_from_1970": 1734386983
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getConnectStatus": {
|
||||||
|
"onboarding": {
|
||||||
|
"get_connect_status": {
|
||||||
|
"status": 0
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"getConnectionType": {
|
"getConnectionType": {
|
||||||
"link_type": "wifi",
|
"link_type": "wifi",
|
||||||
"rssi": "4",
|
"rssi": "4",
|
||||||
"rssiValue": -47,
|
"rssiValue": -45,
|
||||||
"ssid": "I01BU0tFRF9TU0lEIw=="
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
},
|
},
|
||||||
"getDetectionConfig": {
|
"getDetectionConfig": {
|
||||||
@ -355,8 +362,8 @@
|
|||||||
"getLastAlarmInfo": {
|
"getLastAlarmInfo": {
|
||||||
"system": {
|
"system": {
|
||||||
"last_alarm_info": {
|
"last_alarm_info": {
|
||||||
"last_alarm_time": "0",
|
"last_alarm_time": "1734386954",
|
||||||
"last_alarm_type": ""
|
"last_alarm_type": "motion"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1025,5 +1032,119 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
},
|
||||||
|
"scanApList": {
|
||||||
|
"onboarding": {
|
||||||
|
"scan": {
|
||||||
|
"ap_list": [
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 2,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 2,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 3,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 2,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"auth": 4,
|
||||||
|
"bssid": "000000000000",
|
||||||
|
"encryption": 3,
|
||||||
|
"rssi": 1,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"wpa3_supported": "false"
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
870
tests/fixtures/smartcam/TC70_3.0_1.3.11.json
vendored
Normal file
870
tests/fixtures/smartcam/TC70_3.0_1.3.11.json
vendored
Normal file
@ -0,0 +1,870 @@
|
|||||||
|
{
|
||||||
|
"discovery_result": {
|
||||||
|
"error_code": 0,
|
||||||
|
"result": {
|
||||||
|
"decrypted_data": {
|
||||||
|
"connect_ssid": "#MASKED_SSID#",
|
||||||
|
"connect_type": "wireless",
|
||||||
|
"device_id": "0000000000000000000000000000000000000000",
|
||||||
|
"http_port": 443,
|
||||||
|
"last_alarm_time": "1734271551",
|
||||||
|
"last_alarm_type": "motion",
|
||||||
|
"owner": "00000000000000000000000000000000",
|
||||||
|
"sd_status": "offline"
|
||||||
|
},
|
||||||
|
"device_id": "00000000000000000000000000000000",
|
||||||
|
"device_model": "TC70",
|
||||||
|
"device_name": "#MASKED_NAME#",
|
||||||
|
"device_type": "SMART.IPCAMERA",
|
||||||
|
"encrypt_info": {
|
||||||
|
"data": "",
|
||||||
|
"key": "",
|
||||||
|
"sym_schm": "AES"
|
||||||
|
},
|
||||||
|
"encrypt_type": [
|
||||||
|
"3"
|
||||||
|
],
|
||||||
|
"factory_default": false,
|
||||||
|
"firmware_version": "1.3.11 Build 231121 Rel.39429n(4555)",
|
||||||
|
"hardware_version": "3.0",
|
||||||
|
"ip": "127.0.0.123",
|
||||||
|
"is_support_iot_cloud": true,
|
||||||
|
"mac": "5C-E9-31-00-00-00",
|
||||||
|
"mgt_encrypt_schm": {
|
||||||
|
"is_support_https": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getAlertPlan": {
|
||||||
|
"msg_alarm_plan": {
|
||||||
|
"chn1_msg_alarm_plan": {
|
||||||
|
".name": "chn1_msg_alarm_plan",
|
||||||
|
".type": "plan",
|
||||||
|
"alarm_plan_1": "0000-0000,127",
|
||||||
|
"enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getAppComponentList": {
|
||||||
|
"app_component": {
|
||||||
|
"app_component_list": [
|
||||||
|
{
|
||||||
|
"name": "sdCard",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "timezone",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "system",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "led",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "playback",
|
||||||
|
"version": 4
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "detection",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "alert",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "firmware",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "account",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "quickSetup",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "ptz",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "video",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lensMask",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "lightFrequency",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "dayNightMode",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "osd",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "record",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "videoRotation",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "audio",
|
||||||
|
"version": 2
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "diagnose",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "msgPush",
|
||||||
|
"version": 3
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "deviceShare",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "tapoCare",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "blockZone",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "personDetection",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "targetTrack",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "babyCryDetection",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "needSubscriptionServiceList",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "iotCloud",
|
||||||
|
"version": 1
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "recordDownload",
|
||||||
|
"version": 1
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getAudioConfig": {
|
||||||
|
"audio_config": {
|
||||||
|
"microphone": {
|
||||||
|
".name": "microphone",
|
||||||
|
".type": "audio_config",
|
||||||
|
"channels": "1",
|
||||||
|
"encode_type": "G711alaw",
|
||||||
|
"mute": "off",
|
||||||
|
"noise_cancelling": "on",
|
||||||
|
"sampling_rate": "8",
|
||||||
|
"volume": "100"
|
||||||
|
},
|
||||||
|
"speaker": {
|
||||||
|
".name": "speaker",
|
||||||
|
".type": "audio_config",
|
||||||
|
"volume": "100"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getBCDConfig": {
|
||||||
|
"sound_detection": {
|
||||||
|
"bcd": {
|
||||||
|
".name": "bcd",
|
||||||
|
".type": "on_off",
|
||||||
|
"digital_sensitivity": "50",
|
||||||
|
"enabled": "off",
|
||||||
|
"sensitivity": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getCircularRecordingConfig": {
|
||||||
|
"harddisk_manage": {
|
||||||
|
"harddisk": {
|
||||||
|
".name": "harddisk",
|
||||||
|
".type": "storage",
|
||||||
|
"loop": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getClockStatus": {
|
||||||
|
"system": {
|
||||||
|
"clock_status": {
|
||||||
|
"local_time": "2024-12-18 22:59:11",
|
||||||
|
"seconds_from_1970": 1734562751
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getConnectionType": {
|
||||||
|
"link_type": "wifi",
|
||||||
|
"rssi": "4",
|
||||||
|
"rssiValue": -50,
|
||||||
|
"ssid": "I01BU0tFRF9TU0lEIw=="
|
||||||
|
},
|
||||||
|
"getDetectionConfig": {
|
||||||
|
"motion_detection": {
|
||||||
|
"motion_det": {
|
||||||
|
".name": "motion_det",
|
||||||
|
".type": "on_off",
|
||||||
|
"digital_sensitivity": "50",
|
||||||
|
"enabled": "on",
|
||||||
|
"sensitivity": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getDeviceInfo": {
|
||||||
|
"device_info": {
|
||||||
|
"basic_info": {
|
||||||
|
"avatar": "camera c212",
|
||||||
|
"barcode": "",
|
||||||
|
"dev_id": "0000000000000000000000000000000000000000",
|
||||||
|
"device_alias": "#MASKED_NAME#",
|
||||||
|
"device_info": "TC70 3.0 IPC",
|
||||||
|
"device_model": "TC70",
|
||||||
|
"device_name": "#MASKED_NAME#",
|
||||||
|
"device_type": "SMART.IPCAMERA",
|
||||||
|
"features": "3",
|
||||||
|
"ffs": false,
|
||||||
|
"has_set_location_info": 1,
|
||||||
|
"hw_desc": "00000000000000000000000000000000",
|
||||||
|
"hw_version": "3.0",
|
||||||
|
"is_cal": true,
|
||||||
|
"latitude": 0,
|
||||||
|
"longitude": 0,
|
||||||
|
"mac": "5C-E9-31-00-00-00",
|
||||||
|
"oem_id": "00000000000000000000000000000000",
|
||||||
|
"sw_version": "1.3.11 Build 231121 Rel.39429n(4555)"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getFirmwareAutoUpgradeConfig": {
|
||||||
|
"auto_upgrade": {
|
||||||
|
"common": {
|
||||||
|
".name": "common",
|
||||||
|
".type": "on_off",
|
||||||
|
"enabled": "off",
|
||||||
|
"random_range": "120",
|
||||||
|
"time": "03:00"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getFirmwareUpdateStatus": {
|
||||||
|
"cloud_config": {
|
||||||
|
"upgrade_status": {
|
||||||
|
"lastUpgradingSuccess": false,
|
||||||
|
"state": "normal"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLastAlarmInfo": {
|
||||||
|
"system": {
|
||||||
|
"last_alarm_info": {
|
||||||
|
"last_alarm_time": "1734271551",
|
||||||
|
"last_alarm_type": "motion"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLdc": {
|
||||||
|
"image": {
|
||||||
|
"common": {
|
||||||
|
".name": "common",
|
||||||
|
".type": "para",
|
||||||
|
"area_compensation": "default",
|
||||||
|
"chroma": "50",
|
||||||
|
"contrast": "50",
|
||||||
|
"dehaze": "off",
|
||||||
|
"exp_gain": "0",
|
||||||
|
"exp_type": "auto",
|
||||||
|
"focus_limited": "600",
|
||||||
|
"focus_type": "semi_auto",
|
||||||
|
"high_light_compensation": "off",
|
||||||
|
"inf_delay": "10",
|
||||||
|
"inf_end_time": "21600",
|
||||||
|
"inf_sensitivity": "1",
|
||||||
|
"inf_start_time": "64800",
|
||||||
|
"inf_type": "auto",
|
||||||
|
"light_freq_mode": "auto",
|
||||||
|
"lock_blue_colton": "0",
|
||||||
|
"lock_blue_gain": "0",
|
||||||
|
"lock_gb_gain": "0",
|
||||||
|
"lock_gr_gain": "0",
|
||||||
|
"lock_green_colton": "0",
|
||||||
|
"lock_red_colton": "0",
|
||||||
|
"lock_red_gain": "0",
|
||||||
|
"lock_source": "local",
|
||||||
|
"luma": "50",
|
||||||
|
"saturation": "50",
|
||||||
|
"sharpness": "50",
|
||||||
|
"shutter": "1/25",
|
||||||
|
"smartir": "off",
|
||||||
|
"smartir_level": "100",
|
||||||
|
"wb_B_gain": "50",
|
||||||
|
"wb_G_gain": "50",
|
||||||
|
"wb_R_gain": "50",
|
||||||
|
"wb_type": "auto",
|
||||||
|
"wd_gain": "50",
|
||||||
|
"wide_dynamic": "off"
|
||||||
|
},
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLedStatus": {
|
||||||
|
"led": {
|
||||||
|
"config": {
|
||||||
|
".name": "config",
|
||||||
|
".type": "led",
|
||||||
|
"enabled": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLensMaskConfig": {
|
||||||
|
"lens_mask": {
|
||||||
|
"lens_mask_info": {
|
||||||
|
".name": "lens_mask_info",
|
||||||
|
".type": "lens_mask_info",
|
||||||
|
"enabled": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getLightFrequencyInfo": {
|
||||||
|
"image": {
|
||||||
|
"common": {
|
||||||
|
".name": "common",
|
||||||
|
".type": "para",
|
||||||
|
"area_compensation": "default",
|
||||||
|
"chroma": "50",
|
||||||
|
"contrast": "50",
|
||||||
|
"dehaze": "off",
|
||||||
|
"exp_gain": "0",
|
||||||
|
"exp_type": "auto",
|
||||||
|
"focus_limited": "600",
|
||||||
|
"focus_type": "semi_auto",
|
||||||
|
"high_light_compensation": "off",
|
||||||
|
"inf_delay": "10",
|
||||||
|
"inf_end_time": "21600",
|
||||||
|
"inf_sensitivity": "1",
|
||||||
|
"inf_start_time": "64800",
|
||||||
|
"inf_type": "auto",
|
||||||
|
"light_freq_mode": "auto",
|
||||||
|
"lock_blue_colton": "0",
|
||||||
|
"lock_blue_gain": "0",
|
||||||
|
"lock_gb_gain": "0",
|
||||||
|
"lock_gr_gain": "0",
|
||||||
|
"lock_green_colton": "0",
|
||||||
|
"lock_red_colton": "0",
|
||||||
|
"lock_red_gain": "0",
|
||||||
|
"lock_source": "local",
|
||||||
|
"luma": "50",
|
||||||
|
"saturation": "50",
|
||||||
|
"sharpness": "50",
|
||||||
|
"shutter": "1/25",
|
||||||
|
"smartir": "off",
|
||||||
|
"smartir_level": "100",
|
||||||
|
"wb_B_gain": "50",
|
||||||
|
"wb_G_gain": "50",
|
||||||
|
"wb_R_gain": "50",
|
||||||
|
"wb_type": "auto",
|
||||||
|
"wd_gain": "50",
|
||||||
|
"wide_dynamic": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getMediaEncrypt": {
|
||||||
|
"cet": {
|
||||||
|
"media_encrypt": {
|
||||||
|
".name": "media_encrypt",
|
||||||
|
".type": "on_off",
|
||||||
|
"enabled": "on"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getMsgPushConfig": {
|
||||||
|
"msg_push": {
|
||||||
|
"chn1_msg_push_info": {
|
||||||
|
".name": "chn1_msg_push_info",
|
||||||
|
".type": "on_off",
|
||||||
|
"notification_enabled": "on",
|
||||||
|
"rich_notification_enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getNightVisionModeConfig": {
|
||||||
|
"image": {
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getPersonDetectionConfig": {
|
||||||
|
"people_detection": {
|
||||||
|
"detection": {
|
||||||
|
".name": "detection",
|
||||||
|
".type": "on_off",
|
||||||
|
"enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getPresetConfig": {
|
||||||
|
"preset": {
|
||||||
|
"preset": {
|
||||||
|
"id": [
|
||||||
|
"1"
|
||||||
|
],
|
||||||
|
"name": [
|
||||||
|
"Viewpoint 1"
|
||||||
|
],
|
||||||
|
"position_pan": [
|
||||||
|
"0.088935"
|
||||||
|
],
|
||||||
|
"position_tilt": [
|
||||||
|
"-1.000000"
|
||||||
|
],
|
||||||
|
"read_only": [
|
||||||
|
"0"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getRecordPlan": {
|
||||||
|
"record_plan": {
|
||||||
|
"chn1_channel": {
|
||||||
|
".name": "chn1_channel",
|
||||||
|
".type": "plan",
|
||||||
|
"enabled": "on",
|
||||||
|
"friday": "[\"0000-2400:2\"]",
|
||||||
|
"monday": "[\"0000-2400:2\"]",
|
||||||
|
"saturday": "[\"0000-2400:2\"]",
|
||||||
|
"sunday": "[\"0000-2400:2\"]",
|
||||||
|
"thursday": "[\"0000-2400:2\"]",
|
||||||
|
"tuesday": "[\"0000-2400:2\"]",
|
||||||
|
"wednesday": "[\"0000-2400:2\"]"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getRotationStatus": {
|
||||||
|
"image": {
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getSdCardStatus": {
|
||||||
|
"harddisk_manage": {
|
||||||
|
"hd_info": [
|
||||||
|
{
|
||||||
|
"hd_info_1": {
|
||||||
|
"detect_status": "offline",
|
||||||
|
"disk_name": "1",
|
||||||
|
"free_space": "0B",
|
||||||
|
"loop_record_status": "0",
|
||||||
|
"msg_push_free_space": "0B",
|
||||||
|
"msg_push_total_space": "0B",
|
||||||
|
"percent": "0",
|
||||||
|
"picture_free_space": "0B",
|
||||||
|
"picture_total_space": "0B",
|
||||||
|
"record_duration": "0",
|
||||||
|
"record_free_duration": "0",
|
||||||
|
"record_start_time": "0",
|
||||||
|
"rw_attr": "r",
|
||||||
|
"status": "offline",
|
||||||
|
"total_space": "0B",
|
||||||
|
"type": "local",
|
||||||
|
"video_free_space": "0B",
|
||||||
|
"video_total_space": "0B",
|
||||||
|
"write_protect": "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getTamperDetectionConfig": {
|
||||||
|
"tamper_detection": {
|
||||||
|
"tamper_det": {
|
||||||
|
".name": "tamper_det",
|
||||||
|
".type": "on_off",
|
||||||
|
"digital_sensitivity": "50",
|
||||||
|
"enabled": "off",
|
||||||
|
"sensitivity": "medium"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getTargetTrackConfig": {
|
||||||
|
"target_track": {
|
||||||
|
"target_track_info": {
|
||||||
|
".name": "target_track_info",
|
||||||
|
".type": "target_track_info",
|
||||||
|
"enabled": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getTimezone": {
|
||||||
|
"system": {
|
||||||
|
"basic": {
|
||||||
|
".name": "basic",
|
||||||
|
".type": "setting",
|
||||||
|
"timezone": "UTC-00:00",
|
||||||
|
"timing_mode": "ntp",
|
||||||
|
"zone_id": "Europe/London"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getVideoCapability": {
|
||||||
|
"video_capability": {
|
||||||
|
"main": {
|
||||||
|
".name": "main",
|
||||||
|
".type": "capability",
|
||||||
|
"bitrate_types": [
|
||||||
|
"cbr",
|
||||||
|
"vbr"
|
||||||
|
],
|
||||||
|
"bitrates": [
|
||||||
|
"256",
|
||||||
|
"512",
|
||||||
|
"1024",
|
||||||
|
"2048"
|
||||||
|
],
|
||||||
|
"encode_types": [
|
||||||
|
"H264"
|
||||||
|
],
|
||||||
|
"frame_rates": [
|
||||||
|
"65537",
|
||||||
|
"65546",
|
||||||
|
"65551"
|
||||||
|
],
|
||||||
|
"qualitys": [
|
||||||
|
"1",
|
||||||
|
"3",
|
||||||
|
"5"
|
||||||
|
],
|
||||||
|
"resolutions": [
|
||||||
|
"1920*1080",
|
||||||
|
"1280*720",
|
||||||
|
"640*360"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getVideoQualities": {
|
||||||
|
"video": {
|
||||||
|
"main": {
|
||||||
|
".name": "main",
|
||||||
|
".type": "stream",
|
||||||
|
"bitrate": "1024",
|
||||||
|
"bitrate_type": "vbr",
|
||||||
|
"encode_type": "H264",
|
||||||
|
"frame_rate": "65551",
|
||||||
|
"gop_factor": "2",
|
||||||
|
"name": "VideoEncoder_1",
|
||||||
|
"quality": "3",
|
||||||
|
"resolution": "1280*720",
|
||||||
|
"stream_type": "general"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getWhitelampConfig": {
|
||||||
|
"image": {
|
||||||
|
"switch": {
|
||||||
|
".name": "switch",
|
||||||
|
".type": "switch_type",
|
||||||
|
"flip_type": "off",
|
||||||
|
"ldc": "off",
|
||||||
|
"night_vision_mode": "inf_night_vision",
|
||||||
|
"rotate_type": "off",
|
||||||
|
"schedule_end_time": "64800",
|
||||||
|
"schedule_start_time": "21600",
|
||||||
|
"switch_mode": "common",
|
||||||
|
"wtl_intensity_level": "5"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"getWhitelampStatus": {
|
||||||
|
"rest_time": 0,
|
||||||
|
"status": 0
|
||||||
|
},
|
||||||
|
"get_audio_capability": {
|
||||||
|
"get": {
|
||||||
|
"audio_capability": {
|
||||||
|
"device_microphone": {
|
||||||
|
".name": "device_microphone",
|
||||||
|
".type": "capability",
|
||||||
|
"aec": "1",
|
||||||
|
"channels": "1",
|
||||||
|
"echo_cancelling": "0",
|
||||||
|
"encode_type": [
|
||||||
|
"G711alaw"
|
||||||
|
],
|
||||||
|
"half_duplex": "1",
|
||||||
|
"mute": "1",
|
||||||
|
"noise_cancelling": "1",
|
||||||
|
"sampling_rate": [
|
||||||
|
"8"
|
||||||
|
],
|
||||||
|
"volume": "1"
|
||||||
|
},
|
||||||
|
"device_speaker": {
|
||||||
|
".name": "device_speaker",
|
||||||
|
".type": "capability",
|
||||||
|
"channels": "1",
|
||||||
|
"decode_type": [
|
||||||
|
"G711"
|
||||||
|
],
|
||||||
|
"mute": "0",
|
||||||
|
"sampling_rate": [
|
||||||
|
"8"
|
||||||
|
],
|
||||||
|
"volume": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_audio_config": {
|
||||||
|
"get": {
|
||||||
|
"audio_config": {
|
||||||
|
"microphone": {
|
||||||
|
".name": "microphone",
|
||||||
|
".type": "audio_config",
|
||||||
|
"channels": "1",
|
||||||
|
"encode_type": "G711alaw",
|
||||||
|
"mute": "off",
|
||||||
|
"noise_cancelling": "on",
|
||||||
|
"sampling_rate": "8",
|
||||||
|
"volume": "100"
|
||||||
|
},
|
||||||
|
"speaker": {
|
||||||
|
".name": "speaker",
|
||||||
|
".type": "audio_config",
|
||||||
|
"volume": "100"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_cet": {
|
||||||
|
"get": {
|
||||||
|
"cet": {
|
||||||
|
"vhttpd": {
|
||||||
|
".name": "vhttpd",
|
||||||
|
".type": "server",
|
||||||
|
"port": "8800"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_function": {
|
||||||
|
"get": {
|
||||||
|
"function": {
|
||||||
|
"module_spec": {
|
||||||
|
".name": "module_spec",
|
||||||
|
".type": "module-spec",
|
||||||
|
"ae_weighting_table_resolution": "5*5",
|
||||||
|
"ai_enhance_capability": "1",
|
||||||
|
"app_version": "1.0.0",
|
||||||
|
"audio": [
|
||||||
|
"speaker",
|
||||||
|
"microphone"
|
||||||
|
],
|
||||||
|
"audioexception_detection": "0",
|
||||||
|
"auth_encrypt": "1",
|
||||||
|
"backlight_coexistence": "1",
|
||||||
|
"change_password": "1",
|
||||||
|
"client_info": "1",
|
||||||
|
"cloud_storage_version": "1.0",
|
||||||
|
"custom_area_compensation": "1",
|
||||||
|
"custom_auto_mode_exposure_level": "0",
|
||||||
|
"device_share": [
|
||||||
|
"preview",
|
||||||
|
"playback",
|
||||||
|
"voice",
|
||||||
|
"motor",
|
||||||
|
"cloud_storage"
|
||||||
|
],
|
||||||
|
"download": [
|
||||||
|
"video"
|
||||||
|
],
|
||||||
|
"events": [
|
||||||
|
"motion",
|
||||||
|
"tamper"
|
||||||
|
],
|
||||||
|
"greeter": "1.0",
|
||||||
|
"http_system_state_audio_support": "1",
|
||||||
|
"intrusion_detection": "1",
|
||||||
|
"led": "1",
|
||||||
|
"lens_mask": "1",
|
||||||
|
"linecrossing_detection": "1",
|
||||||
|
"linkage_capability": "1",
|
||||||
|
"local_storage": "1",
|
||||||
|
"media_encrypt": "1",
|
||||||
|
"msg_alarm": "1",
|
||||||
|
"msg_alarm_list": [
|
||||||
|
"sound",
|
||||||
|
"light"
|
||||||
|
],
|
||||||
|
"msg_alarm_separate_list": [
|
||||||
|
"light",
|
||||||
|
"sound"
|
||||||
|
],
|
||||||
|
"msg_push": "1",
|
||||||
|
"multi_user": "0",
|
||||||
|
"multicast": "0",
|
||||||
|
"network": [
|
||||||
|
"wifi"
|
||||||
|
],
|
||||||
|
"ota_upgrade": "1",
|
||||||
|
"p2p_support_versions": [
|
||||||
|
"1.1"
|
||||||
|
],
|
||||||
|
"playback": [
|
||||||
|
"local",
|
||||||
|
"p2p",
|
||||||
|
"relay"
|
||||||
|
],
|
||||||
|
"playback_scale": "1",
|
||||||
|
"preview": [
|
||||||
|
"local",
|
||||||
|
"p2p",
|
||||||
|
"relay"
|
||||||
|
],
|
||||||
|
"privacy_mask_api_version": "1.0",
|
||||||
|
"ptz": "1",
|
||||||
|
"record_max_slot_cnt": "10",
|
||||||
|
"record_type": [
|
||||||
|
"timing",
|
||||||
|
"motion"
|
||||||
|
],
|
||||||
|
"relay_support_versions": [
|
||||||
|
"1.3"
|
||||||
|
],
|
||||||
|
"reonboarding": "1",
|
||||||
|
"smart_detection": "1",
|
||||||
|
"smart_msg_push_capability": "1",
|
||||||
|
"ssl_cer_version": "1.0",
|
||||||
|
"storage_api_version": "2.2",
|
||||||
|
"stream_max_sessions": "10",
|
||||||
|
"streaming_support_versions": [
|
||||||
|
"1.0"
|
||||||
|
],
|
||||||
|
"target_track": "1.0",
|
||||||
|
"timing_reboot": "1",
|
||||||
|
"verification_change_password": "1",
|
||||||
|
"video_codec": [
|
||||||
|
"h264"
|
||||||
|
],
|
||||||
|
"video_detection_digital_sensitivity": "1",
|
||||||
|
"wifi_cascade_connection": "1",
|
||||||
|
"wifi_connection_info": "1",
|
||||||
|
"wireless_hotspot": "1"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"get_motor": {
|
||||||
|
"get": {
|
||||||
|
"motor": {
|
||||||
|
"capability": {
|
||||||
|
".name": "capability",
|
||||||
|
".type": "ptz",
|
||||||
|
"absolute_move_supported": "1",
|
||||||
|
"calibrate_supported": "1",
|
||||||
|
"continuous_move_supported": "1",
|
||||||
|
"eflip_mode": [
|
||||||
|
"off",
|
||||||
|
"on"
|
||||||
|
],
|
||||||
|
"home_position_mode": "none",
|
||||||
|
"limit_supported": "0",
|
||||||
|
"manual_control_level": [
|
||||||
|
"low",
|
||||||
|
"normal",
|
||||||
|
"high"
|
||||||
|
],
|
||||||
|
"manual_control_mode": [
|
||||||
|
"compatible",
|
||||||
|
"pedestrian",
|
||||||
|
"motor_vehicle",
|
||||||
|
"non_motor_vehicle",
|
||||||
|
"self_adaptive"
|
||||||
|
],
|
||||||
|
"park_supported": "0",
|
||||||
|
"pattern_supported": "0",
|
||||||
|
"plan_supported": "0",
|
||||||
|
"position_pan_range": [
|
||||||
|
"-1.000000",
|
||||||
|
"1.000000"
|
||||||
|
],
|
||||||
|
"position_tilt_range": [
|
||||||
|
"-1.000000",
|
||||||
|
"1.000000"
|
||||||
|
],
|
||||||
|
"poweroff_save_supported": "1",
|
||||||
|
"poweroff_save_time_range": [
|
||||||
|
"10",
|
||||||
|
"600"
|
||||||
|
],
|
||||||
|
"preset_number_max": "8",
|
||||||
|
"preset_supported": "1",
|
||||||
|
"relative_move_supported": "1",
|
||||||
|
"reverse_mode": [
|
||||||
|
"off",
|
||||||
|
"on",
|
||||||
|
"auto"
|
||||||
|
],
|
||||||
|
"scan_supported": "0",
|
||||||
|
"speed_pan_max": "1.00000",
|
||||||
|
"speed_tilt_max": "1.000000",
|
||||||
|
"tour_supported": "0"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -17,10 +17,20 @@ async def test_state(dev: Device):
|
|||||||
if dev.device_type is DeviceType.Hub:
|
if dev.device_type is DeviceType.Hub:
|
||||||
pytest.skip("Hubs cannot be switched on and off")
|
pytest.skip("Hubs cannot be switched on and off")
|
||||||
|
|
||||||
state = dev.is_on
|
if Module.LensMask in dev.modules:
|
||||||
await dev.set_state(not state)
|
state = dev.is_on
|
||||||
|
await dev.set_state(not state)
|
||||||
|
await dev.update()
|
||||||
|
assert dev.is_on is not state
|
||||||
|
|
||||||
|
dev.modules.pop(Module.LensMask) # type: ignore[attr-defined]
|
||||||
|
|
||||||
|
# Test with no lens mask module. Device is always on.
|
||||||
|
assert dev.is_on is True
|
||||||
|
res = await dev.set_state(False)
|
||||||
|
assert res == {}
|
||||||
await dev.update()
|
await dev.update()
|
||||||
assert dev.is_on is not state
|
assert dev.is_on is True
|
||||||
|
|
||||||
|
|
||||||
@device_smartcam
|
@device_smartcam
|
||||||
|
@ -122,8 +122,15 @@ async def test_list_devices(discovery_mock, runner):
|
|||||||
catch_exceptions=False,
|
catch_exceptions=False,
|
||||||
)
|
)
|
||||||
assert res.exit_code == 0
|
assert res.exit_code == 0
|
||||||
header = f"{'HOST':<15} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} {'ALIAS'}"
|
header = (
|
||||||
row = f"{discovery_mock.ip:<15} {discovery_mock.device_type:<20} {discovery_mock.encrypt_type:<7}"
|
f"{'HOST':<15} {'MODEL':<9} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} "
|
||||||
|
f"{'HTTPS':<5} {'LV':<3} {'ALIAS'}"
|
||||||
|
)
|
||||||
|
row = (
|
||||||
|
f"{discovery_mock.ip:<15} {discovery_mock.model:<9} {discovery_mock.device_type:<20} "
|
||||||
|
f"{discovery_mock.encrypt_type:<7} {discovery_mock.https:<5} "
|
||||||
|
f"{discovery_mock.login_version or '-':<3}"
|
||||||
|
)
|
||||||
assert header in res.output
|
assert header in res.output
|
||||||
assert row in res.output
|
assert row in res.output
|
||||||
|
|
||||||
@ -158,14 +165,26 @@ async def test_discover_raw(discovery_mock, runner, mocker):
|
|||||||
redact_spy.assert_called()
|
redact_spy.assert_called()
|
||||||
|
|
||||||
|
|
||||||
|
@pytest.mark.parametrize(
|
||||||
|
("exception", "expected"),
|
||||||
|
[
|
||||||
|
pytest.param(
|
||||||
|
AuthenticationError("Failed to authenticate"),
|
||||||
|
"Authentication failed",
|
||||||
|
id="auth",
|
||||||
|
),
|
||||||
|
pytest.param(TimeoutError(), "Timed out", id="timeout"),
|
||||||
|
pytest.param(Exception("Foobar"), "Error: Foobar", id="other-error"),
|
||||||
|
],
|
||||||
|
)
|
||||||
@new_discovery
|
@new_discovery
|
||||||
async def test_list_auth_failed(discovery_mock, mocker, runner):
|
async def test_list_update_failed(discovery_mock, mocker, runner, exception, expected):
|
||||||
"""Test that device update is called on main."""
|
"""Test that device update is called on main."""
|
||||||
device_class = Discover._get_device_class(discovery_mock.discovery_data)
|
device_class = Discover._get_device_class(discovery_mock.discovery_data)
|
||||||
mocker.patch.object(
|
mocker.patch.object(
|
||||||
device_class,
|
device_class,
|
||||||
"update",
|
"update",
|
||||||
side_effect=AuthenticationError("Failed to authenticate"),
|
side_effect=exception,
|
||||||
)
|
)
|
||||||
res = await runner.invoke(
|
res = await runner.invoke(
|
||||||
cli,
|
cli,
|
||||||
@ -173,10 +192,17 @@ async def test_list_auth_failed(discovery_mock, mocker, runner):
|
|||||||
catch_exceptions=False,
|
catch_exceptions=False,
|
||||||
)
|
)
|
||||||
assert res.exit_code == 0
|
assert res.exit_code == 0
|
||||||
header = f"{'HOST':<15} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} {'ALIAS'}"
|
header = (
|
||||||
row = f"{discovery_mock.ip:<15} {discovery_mock.device_type:<20} {discovery_mock.encrypt_type:<7} - Authentication failed"
|
f"{'HOST':<15} {'MODEL':<9} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} "
|
||||||
assert header in res.output
|
f"{'HTTPS':<5} {'LV':<3} {'ALIAS'}"
|
||||||
assert row in res.output
|
)
|
||||||
|
row = (
|
||||||
|
f"{discovery_mock.ip:<15} {discovery_mock.model:<9} {discovery_mock.device_type:<20} "
|
||||||
|
f"{discovery_mock.encrypt_type:<7} {discovery_mock.https:<5} "
|
||||||
|
f"{discovery_mock.login_version or '-':<3} - {expected}"
|
||||||
|
)
|
||||||
|
assert header in res.output.replace("\n", "")
|
||||||
|
assert row in res.output.replace("\n", "")
|
||||||
|
|
||||||
|
|
||||||
async def test_list_unsupported(unsupported_device_info, runner):
|
async def test_list_unsupported(unsupported_device_info, runner):
|
||||||
@ -187,7 +213,10 @@ async def test_list_unsupported(unsupported_device_info, runner):
|
|||||||
catch_exceptions=False,
|
catch_exceptions=False,
|
||||||
)
|
)
|
||||||
assert res.exit_code == 0
|
assert res.exit_code == 0
|
||||||
header = f"{'HOST':<15} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} {'ALIAS'}"
|
header = (
|
||||||
|
f"{'HOST':<15} {'MODEL':<9} {'DEVICE FAMILY':<20} {'ENCRYPT':<7} "
|
||||||
|
f"{'HTTPS':<5} {'LV':<3} {'ALIAS'}"
|
||||||
|
)
|
||||||
row = f"{'127.0.0.1':<15} UNSUPPORTED DEVICE"
|
row = f"{'127.0.0.1':<15} UNSUPPORTED DEVICE"
|
||||||
assert header in res.output
|
assert header in res.output
|
||||||
assert row in res.output
|
assert row in res.output
|
||||||
|
Loading…
x
Reference in New Issue
Block a user