Do not crash on missing build number in fw version (#1500)
Some checks failed
CI / Perform linting checks (3.13) (push) Has been cancelled
CodeQL checks / Analyze (python) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, macos-latest, 3.13) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, ubuntu-latest, 3.13) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (false, windows-latest, 3.13) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.11) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.12) (push) Has been cancelled
CI / Python ${{ matrix.python-version}} on ${{ matrix.os }}${{ fromJSON('[" (extras)", ""]')[matrix.extras == ''] }} (true, ubuntu-latest, 3.13) (push) Has been cancelled
Stale / stale (push) Has been cancelled

Co-authored-by: Steven B <51370195+sdb9696@users.noreply.github.com>
This commit is contained in:
Teemu R. 2025-02-10 12:13:01 +01:00 committed by GitHub
parent d5187dc6f1
commit 668e32d3a5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
9 changed files with 428 additions and 40 deletions

View File

@ -725,15 +725,6 @@ async def get_smart_test_calls(protocol: SmartProtocol):
successes = [] successes = []
child_device_components = {} child_device_components = {}
extra_test_calls = [
SmartCall(
module="temp_humidity_records",
request=SmartRequest.get_raw_request("get_temp_humidity_records").to_dict(),
should_succeed=False,
child_device_id="",
),
]
click.echo("Testing component_nego call ..", nl=False) click.echo("Testing component_nego call ..", nl=False)
responses = await _make_requests_or_exit( responses = await _make_requests_or_exit(
protocol, protocol,
@ -812,8 +803,6 @@ async def get_smart_test_calls(protocol: SmartProtocol):
click.echo(f"Skipping {component_id}..", nl=False) click.echo(f"Skipping {component_id}..", nl=False)
click.echo(click.style("UNSUPPORTED", fg="yellow")) click.echo(click.style("UNSUPPORTED", fg="yellow"))
test_calls.extend(extra_test_calls)
# Child component calls # Child component calls
for child_device_id, child_components in child_device_components.items(): for child_device_id, child_components in child_device_components.items():
test_calls.append( test_calls.append(
@ -839,12 +828,6 @@ async def get_smart_test_calls(protocol: SmartProtocol):
else: else:
click.echo(f"Skipping {component_id}..", nl=False) click.echo(f"Skipping {component_id}..", nl=False)
click.echo(click.style("UNSUPPORTED", fg="yellow")) click.echo(click.style("UNSUPPORTED", fg="yellow"))
# Add the extra calls for each child
for extra_call in extra_test_calls:
extra_child_call = dataclasses.replace(
extra_call, child_device_id=child_device_id
)
test_calls.append(extra_child_call)
return test_calls, successes return test_calls, successes

View File

@ -425,6 +425,7 @@ COMPONENT_REQUESTS = {
"get_trigger_logs", SmartRequest.GetTriggerLogsParams() "get_trigger_logs", SmartRequest.GetTriggerLogsParams()
) )
], ],
"temp_humidity_record": [SmartRequest.get_raw_request("get_temp_humidity_records")],
"double_click": [SmartRequest.get_raw_request("get_double_click_info")], "double_click": [SmartRequest.get_raw_request("get_double_click_info")],
"child_device": [ "child_device": [
SmartRequest.get_raw_request("get_child_device_list"), SmartRequest.get_raw_request("get_child_device_list"),

View File

@ -48,7 +48,7 @@ async def state(ctx, dev: Device):
) )
echo( echo(
f"Firmware: {dev.device_info.firmware_version}" f"Firmware: {dev.device_info.firmware_version}"
f" {dev.device_info.firmware_build}" f"{' ' + build if (build := dev.device_info.firmware_build) else ''}"
) )
echo(f"MAC (rssi): {dev.mac} ({dev.rssi})") echo(f"MAC (rssi): {dev.mac} ({dev.rssi})")
if verbose: if verbose:

View File

@ -161,7 +161,7 @@ class DeviceInfo:
device_type: DeviceType device_type: DeviceType
hardware_version: str hardware_version: str
firmware_version: str firmware_version: str
firmware_build: str firmware_build: str | None
requires_auth: bool requires_auth: bool
region: str | None region: str | None

View File

@ -760,7 +760,10 @@ class IotDevice(Device):
device_family = sys_info.get("type", sys_info.get("mic_type")) device_family = sys_info.get("type", sys_info.get("mic_type"))
device_type = IotDevice._get_device_type_from_sys_info(info) device_type = IotDevice._get_device_type_from_sys_info(info)
fw_version_full = sys_info["sw_ver"] fw_version_full = sys_info["sw_ver"]
if " " in fw_version_full:
firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1) firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1)
else:
firmware_version, firmware_build = fw_version_full, None
auth = bool(discovery_info and ("mgt_encrypt_schm" in discovery_info)) auth = bool(discovery_info and ("mgt_encrypt_schm" in discovery_info))
return DeviceInfo( return DeviceInfo(

View File

@ -913,7 +913,10 @@ class SmartDevice(Device):
components, device_family components, device_family
) )
fw_version_full = di["fw_ver"] fw_version_full = di["fw_ver"]
if " " in fw_version_full:
firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1) firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1)
else:
firmware_version, firmware_build = fw_version_full, None
_protocol, devicetype = device_family.split(".") _protocol, devicetype = device_family.split(".")
# Brand inferred from SMART.KASAPLUG/SMART.TAPOPLUG etc. # Brand inferred from SMART.KASAPLUG/SMART.TAPOPLUG etc.
brand = devicetype[:4].lower() brand = devicetype[:4].lower()

View File

@ -103,7 +103,10 @@ class SmartCamChild(SmartChildDevice, SmartCamDevice):
model = cifp["device_model"] model = cifp["device_model"]
device_type = SmartCamDevice._get_device_type_from_sysinfo(cifp) device_type = SmartCamDevice._get_device_type_from_sysinfo(cifp)
fw_version_full = cifp["sw_ver"] fw_version_full = cifp["sw_ver"]
if " " in fw_version_full:
firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1) firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1)
else:
firmware_version, firmware_build = fw_version_full, None
return DeviceInfo( return DeviceInfo(
short_name=model, short_name=model,
long_name=model, long_name=model,

View File

@ -47,7 +47,10 @@ class SmartCamDevice(SmartDevice):
long_name = discovery_info["device_model"] if discovery_info else short_name long_name = discovery_info["device_model"] if discovery_info else short_name
device_type = SmartCamDevice._get_device_type_from_sysinfo(basic_info) device_type = SmartCamDevice._get_device_type_from_sysinfo(basic_info)
fw_version_full = basic_info["sw_version"] fw_version_full = basic_info["sw_version"]
if " " in fw_version_full:
firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1) firmware_version, firmware_build = fw_version_full.split(" ", maxsplit=1)
else:
firmware_version, firmware_build = fw_version_full, None
return DeviceInfo( return DeviceInfo(
short_name=basic_info["device_model"], short_name=basic_info["device_model"],
long_name=long_name, long_name=long_name,

View File

@ -75,7 +75,6 @@
} }
] ]
}, },
"get_auto_update_info": -1001,
"get_connect_cloud_state": { "get_connect_cloud_state": {
"status": 0 "status": 0
}, },
@ -84,25 +83,25 @@
"avatar": "sensor_t310", "avatar": "sensor_t310",
"bind_count": 1, "bind_count": 1,
"category": "subg.trigger.temp-hmdt-sensor", "category": "subg.trigger.temp-hmdt-sensor",
"current_humidity": 49, "current_humidity": 61,
"current_humidity_exception": 0, "current_humidity_exception": 1,
"current_temp": 21.7, "current_temp": 21.0,
"current_temp_exception": 0, "current_temp_exception": 0,
"device_id": "SCRUBBED_CHILD_DEVICE_ID_1", "device_id": "SCRUBBED_CHILD_DEVICE_ID_1",
"fw_ver": "1.5.0 Build 230105 Rel.180832", "fw_ver": "1.5.0",
"hw_id": "00000000000000000000000000000000", "hw_id": "00000000000000000000000000000000",
"hw_ver": "1.0", "hw_ver": "1.0",
"jamming_rssi": -111, "jamming_rssi": -108,
"jamming_signal_level": 1, "jamming_signal_level": 2,
"lastOnboardingTimestamp": 1724637745, "lastOnboardingTimestamp": 1690859014,
"mac": "F0A731000000", "mac": "788CB5000000",
"model": "T310", "model": "T310",
"nickname": "I01BU0tFRF9OQU1FIw==", "nickname": "I01BU0tFRF9OQU1FIw==",
"oem_id": "00000000000000000000000000000000", "oem_id": "00000000000000000000000000000000",
"parent_device_id": "0000000000000000000000000000000000000000", "parent_device_id": "0000000000000000000000000000000000000000",
"region": "Australia/Canberra", "region": "Pacific/Auckland",
"report_interval": 16, "report_interval": 8,
"rssi": -46, "rssi": -56,
"signal_level": 3, "signal_level": 3,
"specs": "US", "specs": "US",
"status": "online", "status": "online",
@ -110,8 +109,6 @@
"temp_unit": "celsius", "temp_unit": "celsius",
"type": "SMART.TAPOSENSOR" "type": "SMART.TAPOSENSOR"
}, },
"get_device_time": -1001,
"get_device_usage": -1001,
"get_fw_download_state": { "get_fw_download_state": {
"cloud_cache_seconds": 1, "cloud_cache_seconds": 1,
"download_progress": 0, "download_progress": 0,
@ -121,7 +118,7 @@
}, },
"get_latest_fw": { "get_latest_fw": {
"fw_size": 0, "fw_size": 0,
"fw_ver": "1.5.0 Build 230105 Rel.180832", "fw_ver": "1.5.0",
"hw_id": "", "hw_id": "",
"need_to_upgrade": false, "need_to_upgrade": false,
"oem_id": "", "oem_id": "",
@ -129,10 +126,405 @@
"release_note": "", "release_note": "",
"type": 0 "type": 0
}, },
"get_temp_humidity_records": {
"local_time": 1739107441,
"past24h_humidity": [
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
58,
57,
57,
57,
56,
56,
55,
55,
55,
55,
54,
54,
55,
56,
57,
57,
58,
58,
58,
58,
59,
59,
59,
59,
59,
59,
59,
59,
59,
60,
60,
60,
60,
60,
60,
60,
60,
61,
82,
59,
60,
61,
61,
61,
61
],
"past24h_humidity_exception": [
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
1,
22,
0,
0,
1,
1,
1,
1
],
"past24h_temp": [
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
213,
213,
212,
211,
210,
208,
207,
206,
205,
204,
203,
202,
201,
202,
203,
205,
206,
208,
209,
210,
210,
211,
211,
212,
212,
212,
212,
212,
212,
212,
213,
213,
213,
213,
213,
213,
213,
215,
254,
221,
214,
212,
211,
210,
210
],
"past24h_temp_exception": [
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
-1000,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
4,
0,
0,
0,
0,
0,
0
],
"temp_unit": "celsius"
},
"get_trigger_logs": { "get_trigger_logs": {
"logs": [], "logs": [],
"start_id": 0, "start_id": 0,
"sum": 0 "sum": 0
}, }
"qs_component_nego": -1001
} }