From f77e87dc5dbc8283e20a98d92228b98082951fe3 Mon Sep 17 00:00:00 2001 From: Teemu R Date: Sat, 20 Jan 2024 14:20:08 +0100 Subject: [PATCH] dump_devinfo improvements (#657) * dump_devinfo improvements * Scrub only the last three bytes for mac addresses * Add --target to allow creating fixtures based on discovery * Save fixtures directly to correct location, add --basedir to allow defining the location of repository root * Add --autosave to disable prompting for saving * Update fixtures for devices I have * Add fixture for HS110 hw 4.0 fw 1.0.4 * Improve help strings * Fix tests * Update devtools README * Default to discovery if no host/target given --- devtools/README.md | 18 ++- devtools/dump_devinfo.py | 87 +++++++++---- kasa/smartdevice.py | 8 +- kasa/tests/fixtures/HS110(EU)_1.0_1.2.5.json | 34 ++--- kasa/tests/fixtures/HS110(EU)_4.0_1.0.4.json | 40 ++++++ kasa/tests/fixtures/KL130(EU)_1.0_1.8.8.json | 30 ++--- kasa/tests/fixtures/KP115(EU)_1.0_1.0.16.json | 18 +-- kasa/tests/fixtures/KP303(UK)_1.0_1.0.3.json | 34 ++--- .../fixtures/smart/L530E(EU)_3.0_1.0.6.json | 38 +++--- .../fixtures/smart/L900-5(EU)_1.0_1.0.17.json | 118 +++++++++++++++--- .../fixtures/smart/P110(EU)_1.0_1.2.3.json | 47 ++++--- 11 files changed, 307 insertions(+), 165 deletions(-) create mode 100644 kasa/tests/fixtures/HS110(EU)_4.0_1.0.4.json diff --git a/devtools/README.md b/devtools/README.md index 50425c25..99d5ec5a 100644 --- a/devtools/README.md +++ b/devtools/README.md @@ -3,18 +3,24 @@ This directory contains some simple scripts that can be useful for developers. ## dump_devinfo -* Queries the device and returns a fixture that can be added to the test suite +* Queries the device (if --host is given) or discover devices and creates fixture files that can be added to the test suite. ```shell -Usage: dump_devinfo.py [OPTIONS] HOST +Usage: python -m devtools.dump_devinfo [OPTIONS] - Generate devinfo file for given device. + Generate devinfo files for devices. + + Use --host (for a single device) or --target (for a complete network). Options: + --host TEXT Target host. + --target TEXT Target network for discovery. + --username TEXT Username/email address to authenticate to device. + --password TEXT Password to use to authenticate to device. + --basedir TEXT Base directory for the git repository + --autosave Save without prompting -d, --debug - --help Show this message and exit. - --username For authenticating devices. - --password + --help Show this message and exit. ``` ## create_module_fixtures diff --git a/devtools/dump_devinfo.py b/devtools/dump_devinfo.py index 1fb147c4..85ad0150 100644 --- a/devtools/dump_devinfo.py +++ b/devtools/dump_devinfo.py @@ -13,6 +13,7 @@ import json import logging import re from collections import defaultdict, namedtuple +from pathlib import Path from pprint import pprint from typing import Dict, List @@ -65,7 +66,17 @@ def scrub(res): res[k] = [scrub(vi) for vi in v] else: if k in keys_to_scrub: - if k in ["latitude", "latitude_i", "longitude", "longitude_i"]: + 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"]: v = "127.0.0.123" @@ -95,8 +106,40 @@ def default_to_regular(d): return d +async def handle_device(basedir, autosave, device: SmartDevice): + """Create a fixture for a single device instance.""" + if isinstance(device, TapoDevice): + filename, copy_folder, final = await get_smart_fixture(device) + else: + filename, copy_folder, final = await get_legacy_fixture(device) + + save_filename = Path(basedir) / copy_folder / filename + + pprint(scrub(final)) + if autosave: + save = "y" + else: + save = click.prompt( + f"Do you want to save the above content to {save_filename} (y/n)" + ) + if save == "y": + click.echo(f"Saving info to {save_filename}") + + with open(save_filename, "w") as f: + json.dump(final, f, sort_keys=True, indent=4) + f.write("\n") + else: + click.echo("Not saving.") + + @click.command() -@click.argument("host") +@click.option("--host", required=False, help="Target host.") +@click.option( + "--target", + required=False, + default="255.255.255.255", + help="Target network for discovery.", +) @click.option( "--username", default="", @@ -111,37 +154,31 @@ def default_to_regular(d): envvar="KASA_PASSWORD", help="Password to use to authenticate to device.", ) +@click.option("--basedir", help="Base directory for the git repository", default=".") +@click.option("--autosave", is_flag=True, default=False, help="Save without prompting") @click.option("-d", "--debug", is_flag=True) -async def cli(host, debug, username, password): - """Generate devinfo file for given device.""" +async def cli(host, target, basedir, autosave, debug, username, password): + """Generate devinfo files for devices. + + Use --host (for a single device) or --target (for a complete network). + """ if debug: logging.basicConfig(level=logging.DEBUG) credentials = Credentials(username=username, password=password) - device = await Discover.discover_single(host, credentials=credentials) - - if isinstance(device, TapoDevice): - save_filename, copy_folder, final = await get_smart_fixture(device) + if host is not None: + click.echo("Host given, performing discovery on %s." % host) + device = await Discover.discover_single(host, credentials=credentials) + await handle_device(basedir, autosave, device) else: - save_filename, copy_folder, final = await get_legacy_fixture(device) - - pprint(scrub(final)) - save = click.prompt( - f"Do you want to save the above content to {save_filename} (y/n)" - ) - if save == "y": - click.echo(f"Saving info to {save_filename}") - - with open(save_filename, "w") as f: - json.dump(final, f, sort_keys=True, indent=4) - f.write("\n") - click.echo( - f"Saved. Copy/Move {save_filename} to " - + f"{copy_folder} to add it to the test suite" + "No --host given, performing discovery on %s. Use --target to override." + % target ) - else: - click.echo("Not saving.") + devices = await Discover.discover(target=target, credentials=credentials) + click.echo("Detected %s devices" % len(devices)) + for dev in devices.values(): + await handle_device(basedir, autosave, dev) async def get_legacy_fixture(device): diff --git a/kasa/smartdevice.py b/kasa/smartdevice.py index 4249807f..54e7c449 100755 --- a/kasa/smartdevice.py +++ b/kasa/smartdevice.py @@ -125,7 +125,7 @@ class SmartDevice: >>> dev.rssi -71 >>> dev.mac - 50:C7:BF:01:F8:CD + 50:C7:BF:00:00:00 Some information can also be changed programmatically: @@ -155,9 +155,9 @@ class SmartDevice: 'hw_ver': '1.0', 'mac': '01:23:45:67:89:ab', 'type': 'IOT.SMARTPLUGSWITCH', - 'hwId': '45E29DA8382494D2E82688B52A0B2EB5', + 'hwId': '00000000000000000000000000000000', 'fwId': '00000000000000000000000000000000', - 'oemId': '3D341ECE302C0642C99E31CE2430544B', + 'oemId': '00000000000000000000000000000000', 'dev_name': 'Wi-Fi Smart Plug With Energy Monitoring'} >>> dev.sys_info @@ -175,7 +175,7 @@ class SmartDevice: >>> dev.has_emeter True >>> dev.emeter_realtime - + >>> dev.emeter_today >>> dev.emeter_this_month diff --git a/kasa/tests/fixtures/HS110(EU)_1.0_1.2.5.json b/kasa/tests/fixtures/HS110(EU)_1.0_1.2.5.json index 1a8ced8f..4708d502 100644 --- a/kasa/tests/fixtures/HS110(EU)_1.0_1.2.5.json +++ b/kasa/tests/fixtures/HS110(EU)_1.0_1.2.5.json @@ -1,44 +1,32 @@ { "emeter": { "get_realtime": { - "current": 0.015342, + "current": 0.014937, "err_code": 0, - "power": 0.983971, - "total": 32.448, - "voltage": 235.595234 + "power": 0.928511, + "total": 55.139, + "voltage": 231.067823 } }, - "smartlife.iot.common.emeter": { - "err_code": -1, - "err_msg": "module not support" - }, - "smartlife.iot.dimmer": { - "err_code": -1, - "err_msg": "module not support" - }, - "smartlife.iot.smartbulb.lightingservice": { - "err_code": -1, - "err_msg": "module not support" - }, "system": { "get_sysinfo": { "active_mode": "schedule", "alias": "Kitchen", "dev_name": "Wi-Fi Smart Plug With Energy Monitoring", - "deviceId": "8006588E50AD389303FF31AB6302907A17442F16", + "deviceId": "0000000000000000000000000000000000000000", "err_code": 0, "feature": "TIM:ENE", "fwId": "00000000000000000000000000000000", - "hwId": "45E29DA8382494D2E82688B52A0B2EB5", + "hwId": "00000000000000000000000000000000", "hw_ver": "1.0", "icon_hash": "", - "latitude": 51.476938, + "latitude": 0, "led_off": 1, - "longitude": 7.216849, - "mac": "50:C7:BF:01:F8:CD", + "longitude": 0, + "mac": "50:C7:BF:00:00:00", "model": "HS110(EU)", - "oemId": "3D341ECE302C0642C99E31CE2430544B", - "on_time": 512874, + "oemId": "00000000000000000000000000000000", + "on_time": 6023162, "relay_state": 1, "rssi": -71, "sw_ver": "1.2.5 Build 171213 Rel.101523", diff --git a/kasa/tests/fixtures/HS110(EU)_4.0_1.0.4.json b/kasa/tests/fixtures/HS110(EU)_4.0_1.0.4.json new file mode 100644 index 00000000..1d9b3d3e --- /dev/null +++ b/kasa/tests/fixtures/HS110(EU)_4.0_1.0.4.json @@ -0,0 +1,40 @@ +{ + "emeter": { + "get_realtime": { + "current_ma": 451, + "err_code": 0, + "power_mw": 61753, + "total_wh": 16323, + "voltage_mv": 230837 + } + }, + "system": { + "get_sysinfo": { + "active_mode": "none", + "alias": "#MASKED_NAME#", + "dev_name": "Smart Wi-Fi Plug With Energy Monitoring", + "deviceId": "0000000000000000000000000000000000000000", + "err_code": 0, + "feature": "TIM:ENE", + "hwId": "00000000000000000000000000000000", + "hw_ver": "4.0", + "icon_hash": "", + "latitude_i": 0, + "led_off": 1, + "longitude_i": 0, + "mac": "B0:95:75:00:00:00", + "mic_type": "IOT.SMARTPLUGSWITCH", + "model": "HS110(EU)", + "next_action": { + "type": -1 + }, + "oemId": "00000000000000000000000000000000", + "on_time": 1484778, + "relay_state": 1, + "rssi": -60, + "status": "new", + "sw_ver": "1.0.4 Build 191111 Rel.143500", + "updating": 0 + } + } +} diff --git a/kasa/tests/fixtures/KL130(EU)_1.0_1.8.8.json b/kasa/tests/fixtures/KL130(EU)_1.0_1.8.8.json index b57a01d2..98714cfd 100644 --- a/kasa/tests/fixtures/KL130(EU)_1.0_1.8.8.json +++ b/kasa/tests/fixtures/KL130(EU)_1.0_1.8.8.json @@ -2,24 +2,24 @@ "smartlife.iot.common.emeter": { "get_realtime": { "err_code": 0, - "power_mw": 1300 + "power_mw": 2500 } }, "smartlife.iot.smartbulb.lightingservice": { "get_light_state": { - "brightness": 5, - "color_temp": 2700, + "brightness": 17, + "color_temp": 2500, "err_code": 0, - "hue": 1, + "hue": 0, "mode": "normal", "on_off": 1, - "saturation": 1 + "saturation": 0 } }, "system": { "get_sysinfo": { - "active_mode": "schedule", - "alias": "bedroom", + "active_mode": "none", + "alias": "#MASKED_NAME#", "ctrl_protocols": { "name": "Linkie", "version": "1.0" @@ -29,7 +29,7 @@ "deviceId": "0000000000000000000000000000000000000000", "disco_ver": "1.0", "err_code": 0, - "heapsize": 332316, + "heapsize": 334708, "hwId": "00000000000000000000000000000000", "hw_ver": "1.0", "is_color": 1, @@ -37,20 +37,20 @@ "is_factory": false, "is_variable_color_temp": 1, "light_state": { - "brightness": 5, - "color_temp": 2700, - "hue": 1, + "brightness": 17, + "color_temp": 2500, + "hue": 0, "mode": "normal", "on_off": 1, - "saturation": 1 + "saturation": 0 }, - "mic_mac": "000000000000", + "mic_mac": "1C3BF3000000", "mic_type": "IOT.SMARTBULB", "model": "KL130(EU)", "oemId": "00000000000000000000000000000000", "preferred_state": [ { - "brightness": 10, + "brightness": 50, "color_temp": 2500, "hue": 0, "index": 0, @@ -78,7 +78,7 @@ "saturation": 75 } ], - "rssi": -62, + "rssi": -60, "sw_ver": "1.8.8 Build 190613 Rel.123436" } } diff --git a/kasa/tests/fixtures/KP115(EU)_1.0_1.0.16.json b/kasa/tests/fixtures/KP115(EU)_1.0_1.0.16.json index 790597dc..3b577bac 100644 --- a/kasa/tests/fixtures/KP115(EU)_1.0_1.0.16.json +++ b/kasa/tests/fixtures/KP115(EU)_1.0_1.0.16.json @@ -1,17 +1,17 @@ { "emeter": { "get_realtime": { - "current_ma": 0, + "current_ma": 296, "err_code": 0, - "power_mw": 0, - "total_wh": 0, - "voltage_mv": 231561 + "power_mw": 63499, + "total_wh": 12068, + "voltage_mv": 230577 } }, "system": { "get_sysinfo": { "active_mode": "none", - "alias": "TP-LINK_Smart Plug_330B", + "alias": "#MASKED_NAME#", "dev_name": "Smart Wi-Fi Plug Mini", "deviceId": "0000000000000000000000000000000000000000", "err_code": 0, @@ -20,9 +20,9 @@ "hw_ver": "1.0", "icon_hash": "", "latitude_i": 0, - "led_off": 0, + "led_off": 1, "longitude_i": 0, - "mac": "00:00:00:00:00:00", + "mac": "C0:06:C3:00:00:00", "mic_type": "IOT.SMARTPLUGSWITCH", "model": "KP115(EU)", "next_action": { @@ -31,9 +31,9 @@ "ntc_state": 0, "obd_src": "tplink", "oemId": "00000000000000000000000000000000", - "on_time": 197, + "on_time": 2078998, "relay_state": 1, - "rssi": -70, + "rssi": -49, "status": "new", "sw_ver": "1.0.16 Build 210205 Rel.163735", "updating": 0 diff --git a/kasa/tests/fixtures/KP303(UK)_1.0_1.0.3.json b/kasa/tests/fixtures/KP303(UK)_1.0_1.0.3.json index 40a6a259..c6d632f0 100644 --- a/kasa/tests/fixtures/KP303(UK)_1.0_1.0.3.json +++ b/kasa/tests/fixtures/KP303(UK)_1.0_1.0.3.json @@ -1,20 +1,4 @@ { - "emeter": { - "err_code": -1, - "err_msg": "module not support" - }, - "smartlife.iot.common.emeter": { - "err_code": -1, - "err_msg": "module not support" - }, - "smartlife.iot.dimmer": { - "err_code": -1, - "err_msg": "module not support" - }, - "smartlife.iot.smartbulb.lightingservice": { - "err_code": -1, - "err_msg": "module not support" - }, "system": { "get_sysinfo": { "alias": "TP-LINK_Power Strip_CF69", @@ -22,29 +6,29 @@ "children": [ { "alias": "Plug 1", - "id": "00", + "id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7700", "next_action": { "type": -1 }, - "on_time": 302, + "on_time": 79701, "state": 1 }, { "alias": "Plug 2", - "id": "01", + "id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7701", "next_action": { "type": -1 }, - "on_time": 0, + "on_time": 79700, "state": 0 }, { "alias": "Plug 3", - "id": "02", + "id": "8006E9854025B67C3F9D99BA1E66223D1C9A8A7702", "next_action": { "type": -1 }, - "on_time": 0, + "on_time": 1484408, "state": 0 } ], @@ -54,14 +38,14 @@ "hwId": "00000000000000000000000000000000", "hw_ver": "1.0", "latitude_i": 0, - "led_off": 0, + "led_off": 1, "longitude_i": 0, - "mac": "00:00:00:00:00:00", + "mac": "1C:3B:F3:00:00:00", "mic_type": "IOT.SMARTPLUGSWITCH", "model": "KP303(UK)", "ntc_state": 0, "oemId": "00000000000000000000000000000000", - "rssi": -63, + "rssi": -68, "status": "new", "sw_ver": "1.0.3 Build 191105 Rel.113122", "updating": 0 diff --git a/kasa/tests/fixtures/smart/L530E(EU)_3.0_1.0.6.json b/kasa/tests/fixtures/smart/L530E(EU)_3.0_1.0.6.json index 09fd8edb..10b9d300 100644 --- a/kasa/tests/fixtures/smart/L530E(EU)_3.0_1.0.6.json +++ b/kasa/tests/fixtures/smart/L530E(EU)_3.0_1.0.6.json @@ -106,7 +106,7 @@ "factory_default": false, "ip": "127.0.0.123", "is_support_iot_cloud": true, - "mac": "00-00-00-00-00-00", + "mac": "5C-E9-31-00-00-00", "mgt_encrypt_schm": { "encrypt_type": "AES", "http_port": 80, @@ -141,7 +141,7 @@ "get_device_info": { "avatar": "bulb", "brightness": 100, - "color_temp": 2500, + "color_temp": 6500, "color_temp_range": [ 2500, 6500 @@ -150,33 +150,33 @@ "re_power_type": "always_on", "state": { "brightness": 100, - "color_temp": 2500, - "hue": 31, - "saturation": 88 + "color_temp": 6500, + "hue": 9, + "saturation": 67 }, "type": "last_states" }, "device_id": "0000000000000000000000000000000000000000", - "device_on": false, + "device_on": true, "dynamic_light_effect_enable": false, "fw_id": "00000000000000000000000000000000", "fw_ver": "1.0.6 Build 230509 Rel.195312", "has_set_location_info": true, - "hue": 31, + "hue": 9, "hw_id": "00000000000000000000000000000000", "hw_ver": "3.0", "ip": "127.0.0.123", "lang": "en_US", "latitude": 0, "longitude": 0, - "mac": "00-00-00-00-00-00", + "mac": "5C-E9-31-00-00-00", "model": "L530", "nickname": "I01BU0tFRF9OQU1FIw==", "oem_id": "00000000000000000000000000000000", "overheated": false, "region": "Europe/Berlin", "rssi": -48, - "saturation": 88, + "saturation": 67, "signal_level": 3, "specs": "", "ssid": "I01BU0tFRF9TU0lEIw==", @@ -186,23 +186,23 @@ "get_device_time": { "region": "Europe/Berlin", "time_diff": 60, - "timestamp": 1704212283 + "timestamp": 1705700000 }, "get_device_usage": { "power_usage": { - "past30": 53, - "past7": 12, - "today": 0 + "past30": 19, + "past7": 3, + "today": 3 }, "saved_power": { - "past30": 494, - "past7": 112, - "today": 0 + "past30": 179, + "past7": 20, + "today": 20 }, "time_usage": { - "past30": 547, - "past7": 124, - "today": 0 + "past30": 198, + "past7": 23, + "today": 23 } }, "get_dynamic_light_effect_rules": { diff --git a/kasa/tests/fixtures/smart/L900-5(EU)_1.0_1.0.17.json b/kasa/tests/fixtures/smart/L900-5(EU)_1.0_1.0.17.json index acf96268..a281f2ec 100644 --- a/kasa/tests/fixtures/smart/L900-5(EU)_1.0_1.0.17.json +++ b/kasa/tests/fixtures/smart/L900-5(EU)_1.0_1.0.17.json @@ -110,7 +110,7 @@ "factory_default": false, "ip": "127.0.0.123", "is_support_iot_cloud": true, - "mac": "00-00-00-00-00-00", + "mac": "A8-42-A1-00-00-00", "mgt_encrypt_schm": { "encrypt_type": "AES", "http_port": 80, @@ -141,7 +141,7 @@ "get_device_info": { "avatar": "", "brightness": 100, - "color_temp": 9000, + "color_temp": 0, "color_temp_range": [ 9000, 9000 @@ -149,18 +149,18 @@ "default_states": { "state": { "brightness": 100, - "color_temp": 9000, - "hue": 0, - "saturation": 100 + "color_temp": 0, + "hue": 354, + "saturation": 93 }, "type": "last_states" }, "device_id": "0000000000000000000000000000000000000000", - "device_on": true, + "device_on": false, "fw_id": "00000000000000000000000000000000", "fw_ver": "1.0.17 Build 230426 Rel.153230", "has_set_location_info": false, - "hue": 0, + "hue": 354, "hw_id": "00000000000000000000000000000000", "hw_ver": "1.0", "ip": "127.0.0.123", @@ -175,7 +175,7 @@ "name": "station" }, "longitude": 0, - "mac": "00-00-00-00-00-00", + "mac": "A8-42-A1-00-00-00", "model": "L900", "music_rhythm_enable": false, "music_rhythm_mode": "single_lamp", @@ -183,8 +183,8 @@ "oem_id": "00000000000000000000000000000000", "overheated": false, "region": "Europe/Berlin", - "rssi": -50, - "saturation": 100, + "rssi": -55, + "saturation": 93, "signal_level": 2, "specs": "", "ssid": "I01BU0tFRF9TU0lEIw==", @@ -194,23 +194,23 @@ "get_device_time": { "region": "Europe/Berlin", "time_diff": 0, - "timestamp": 1704389578 + "timestamp": 1705699997 }, "get_device_usage": { "power_usage": { - "past30": 5, - "past7": 5, - "today": 5 + "past30": 15, + "past7": 0, + "today": 0 }, "saved_power": { - "past30": 17, - "past7": 17, - "today": 17 + "past30": 81, + "past7": 1, + "today": 0 }, "time_usage": { - "past30": 22, - "past7": 22, - "today": 22 + "past30": 96, + "past7": 1, + "today": 0 } }, "get_fw_download_state": { @@ -221,6 +221,84 @@ "upgrade_time": 5 }, "get_inherit_info": null, + "get_lighting_effect": { + "brightness": 50, + "custom": 0, + "direction": 1, + "display_colors": [], + "duration": 0, + "enable": 0, + "expansion_strategy": 2, + "id": "", + "name": "station", + "repeat_times": 1, + "segment_length": 1, + "sequence": [ + [ + 300, + 100, + 50 + ], + [ + 240, + 100, + 50 + ], + [ + 180, + 100, + 50 + ], + [ + 120, + 100, + 50 + ], + [ + 60, + 100, + 50 + ], + [ + 0, + 100, + 50 + ], + [ + 0, + 0, + 50 + ], + [ + 0, + 0, + 50 + ], + [ + 0, + 0, + 50 + ], + [ + 0, + 0, + 50 + ], + [ + 0, + 0, + 50 + ], + [ + 0, + 0, + 50 + ] + ], + "spread": 16, + "transition": 400, + "type": "sequence" + }, "get_next_event": {}, "get_on_off_gradually_info": { "enable": false diff --git a/kasa/tests/fixtures/smart/P110(EU)_1.0_1.2.3.json b/kasa/tests/fixtures/smart/P110(EU)_1.0_1.2.3.json index e73742b7..415e8ce6 100644 --- a/kasa/tests/fixtures/smart/P110(EU)_1.0_1.2.3.json +++ b/kasa/tests/fixtures/smart/P110(EU)_1.0_1.2.3.json @@ -86,7 +86,7 @@ "factory_default": false, "ip": "127.0.0.123", "is_support_iot_cloud": true, - "mac": "00-00-00-00-00-00", + "mac": "48-22-54-00-00-00", "mgt_encrypt_schm": { "encrypt_type": "AES", "http_port": 80, @@ -140,7 +140,7 @@ "lang": "en_US", "latitude": 0, "longitude": 0, - "mac": "00-00-00-00-00-00", + "mac": "48-22-54-00-00-00", "model": "P110", "nickname": "I01BU0tFRF9OQU1FIw==", "oem_id": "00000000000000000000000000000000", @@ -158,23 +158,23 @@ "get_device_time": { "region": "Europe/Berlin", "time_diff": 60, - "timestamp": 1704212614 + "timestamp": 1705699998 }, "get_device_usage": { "power_usage": { - "past30": 896, - "past7": 259, - "today": 0 + "past30": 1010, + "past7": 368, + "today": 46 }, "saved_power": { - "past30": 23138, - "past7": 6684, - "today": 0 + "past30": 26144, + "past7": 9536, + "today": 1218 }, "time_usage": { - "past30": 24034, - "past7": 6943, - "today": 0 + "past30": 27154, + "past7": 9904, + "today": 1264 } }, "get_electricity_price_config": { @@ -316,11 +316,11 @@ 0, 0 ], - "local_time": "2024-01-02 17:23:34", - "month_energy": 0, - "month_runtime": 0, - "today_energy": 0, - "today_runtime": 0 + "local_time": "2024-01-19 22:33:18", + "month_energy": 430, + "month_runtime": 11571, + "today_energy": 46, + "today_runtime": 1264 }, "get_fw_download_state": { "auto_upgrade": false, @@ -341,7 +341,7 @@ } }, "get_max_power": { - "max_power": 3847 + "max_power": 3904 }, "get_next_event": {}, "get_protection_power": { @@ -356,7 +356,16 @@ "sum": 0 }, "get_wireless_scan_info": { - "ap_list": [], + "ap_list": [ + { + "bssid": "000000000000", + "channel": 0, + "cipher_type": 2, + "key_type": "wpa_psk", + "signal_level": 3, + "ssid": "I01BU0tFRF9TU0lEIw==" + } + ], "wep_supported": false }, "qs_component_nego": {