[Custom Component] TP-Link Router Integration

@jmrplens
Could you try this code please?

from tplinkrouterc6u import TPLinkDecoClient
from logging import Logger
import json

client = TPLinkDecoClient('192.168.0.2', 'your_password', logger=Logger('test'))
client.authorize()

result = client.get_status()

for item in result.devices:
    print('{} - {}'.format(item.hostname, item.ipaddr))

Error located, with the script now I get the same error I read in the HA log:

Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/root/test.py", line 10, in <module>
    for item in result.devices:
                ^^^^^^^^^^^^^^
AttributeError: 'dict' object has no attribute 'devices'
root@jmrp:~# nano test.py
root@jmrp:~# python3 -m test
Traceback (most recent call last):
  File "<frozen runpy>", line 198, in _run_module_as_main
  File "<frozen runpy>", line 88, in _run_code
  File "/root/test.py", line 8, in <module>
    result = client.get_status()
             ^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.11/dist-packages/tplinkrouterc6u/client.py", line 521, in get_status
    ipaddress.IPv4Address(item['ip']),
    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/ipaddress.py", line 1315, in __init__
    self._ip = self._ip_int_from_string(addr_str)
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/lib/python3.11/ipaddress.py", line 1198, in _ip_int_from_string
    raise AddressValueError('Address cannot be empty')
ipaddress.AddressValueError: Address cannot be empty

Traceback detailed (with rich console):

python3 -m test
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ in _run_module_as_main:198                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚   alter_argv = True                                                                          โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x7f79fc228dc0, file "/root/test.py", line 1>        โ”‚ โ”‚
โ”‚ โ”‚ main_globals = {                                                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f79fc299dd0>,                                                              โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                                       โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at                 โ”‚ โ”‚
โ”‚ โ”‚                0x7f79fc299dd0>, origin='/root/test.py'),                                     โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                                    โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                           โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                              โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class 'tplinkrouterc6u.client.TPLinkDecoClient'>,    โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +4                                                                    โ”‚ โ”‚
โ”‚ โ”‚                }                                                                             โ”‚ โ”‚
โ”‚ โ”‚     mod_name = 'test'                                                                        โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test', loader=<_frozen_importlib_external.SourceFileLoader   โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f79fc299dd0>, origin='/root/test.py')                            โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚ in _run_code:88                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚       cached = '/root/__pycache__/test.cpython-311.pyc'                                      โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x7f79fc228dc0, file "/root/test.py", line 1>        โ”‚ โ”‚
โ”‚ โ”‚        fname = '/root/test.py'                                                               โ”‚ โ”‚
โ”‚ โ”‚ init_globals = None                                                                          โ”‚ โ”‚
โ”‚ โ”‚       loader = <_frozen_importlib_external.SourceFileLoader object at 0x7f79fc299dd0>        โ”‚ โ”‚
โ”‚ โ”‚     mod_name = '__main__'                                                                    โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test', loader=<_frozen_importlib_external.SourceFileLoader   โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f79fc299dd0>, origin='/root/test.py')                            โ”‚ โ”‚
โ”‚ โ”‚     pkg_name = ''                                                                            โ”‚ โ”‚
โ”‚ โ”‚  run_globals = {                                                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f79fc299dd0>,                                                              โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                                       โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at                 โ”‚ โ”‚
โ”‚ โ”‚                0x7f79fc299dd0>, origin='/root/test.py'),                                     โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                                    โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                           โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                              โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class 'tplinkrouterc6u.client.TPLinkDecoClient'>,    โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +4                                                                    โ”‚ โ”‚
โ”‚ โ”‚                }                                                                             โ”‚ โ”‚
โ”‚ โ”‚  script_name = None                                                                          โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /root/test.py:10 in <module>                                                                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    7 client = TPLinkDecoClient('192.168.0.2', 'MyPassWord', logger=Logger('    โ”‚
โ”‚    8 client.authorize()                                                                          โ”‚
โ”‚    9                                                                                             โ”‚
โ”‚ โฑ 10 result = client.get_status()                                                                โ”‚
โ”‚   11                                                                                             โ”‚
โ”‚   12 for item in result.devices:                                                                 โ”‚
โ”‚   13 โ”‚   print('{} - {}'.format(item.hostname, item.ipaddr))                                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ        โ”‚
โ”‚ โ”‚           client = <tplinkrouterc6u.client.TPLinkDecoClient object at 0x7f79faa92f50> โ”‚        โ”‚
โ”‚ โ”‚          install = <function install at 0x7f79faa8aa20>                               โ”‚        โ”‚
โ”‚ โ”‚             json = <module 'json' from '/usr/lib/python3.11/json/__init__.py'>        โ”‚        โ”‚
โ”‚ โ”‚           Logger = <class 'logging.Logger'>                                           โ”‚        โ”‚
โ”‚ โ”‚ TPLinkDecoClient = <class 'tplinkrouterc6u.client.TPLinkDecoClient'>                  โ”‚        โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /usr/local/lib/python3.11/dist-packages/tplinkrouterc6u/client.py:521 in get_status              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚    518 โ”‚   โ”‚   โ”‚   โ”‚   status.guest_clients_total += 1                                           โ”‚
โ”‚    519 โ”‚   โ”‚   โ”‚   devices.append(Device(self._map_wire_type(item),                              โ”‚
โ”‚    520 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚     macaddress.EUI48(item['mac']),                          โ”‚
โ”‚ โฑ  521 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚     ipaddress.IPv4Address(item['ip']),                      โ”‚
โ”‚    522 โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚   โ”‚     base64.b64decode(item['name']).decode()))               โ”‚
โ”‚    523 โ”‚   โ”‚                                                                                     โ”‚
โ”‚    524 โ”‚   โ”‚   status.clients_total = status.wired_total + status.wifi_clients_total + status.g  โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                 โ”‚
โ”‚ โ”‚    data = [                                                                  โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 1,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 1,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   {                                                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'up_speed': 0,                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'down_speed': 0,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'wire_type': 'wireless',                                   โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'access_host': '1',                                        โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'connection_type': 'band2_4',                              โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'space_id': '1',                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'ip': '100.100.100.100',                                                  โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'client_mesh': True,                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   'online': True,                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   โ”‚   ... +6                                                     โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   },                                                             โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   ... +28                                                        โ”‚                 โ”‚
โ”‚ โ”‚           ]                                                                  โ”‚                 โ”‚
โ”‚ โ”‚ devices = [                                                                  โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device(),                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   Device()                                                       โ”‚                 โ”‚
โ”‚ โ”‚           ]                                                                  โ”‚                 โ”‚
โ”‚ โ”‚ element = ''                                                                 โ”‚                 โ”‚
โ”‚ โ”‚    item = {                                                                  โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'mac': 'FF-FF-FF-FF-FF-FF',                                    โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'up_speed': 0,                                                 โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'down_speed': 0,                                               โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'wire_type': 'wireless',                                       โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'access_host': '1',                                            โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'connection_type': 'band2_4',                                  โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'space_id': '1',                                               โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'ip': '100.100.100.100',                                                      โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'client_mesh': True,                                           โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   'online': True,                                                โ”‚                 โ”‚
โ”‚ โ”‚           โ”‚   ... +6                                                         โ”‚                 โ”‚
โ”‚ โ”‚           }                                                                  โ”‚                 โ”‚
โ”‚ โ”‚    self = <tplinkrouterc6u.client.TPLinkDecoClient object at 0x7f79faa92f50> โ”‚                 โ”‚
โ”‚ โ”‚  status = Status()                                                           โ”‚                 โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                 โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /usr/lib/python3.11/ipaddress.py:1315 in __init__                                                โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1312 โ”‚   โ”‚   addr_str = str(address)                                                           โ”‚
โ”‚   1313 โ”‚   โ”‚   if '/' in addr_str:                                                               โ”‚
โ”‚   1314 โ”‚   โ”‚   โ”‚   raise AddressValueError(f"Unexpected '/' in {address!r}")                     โ”‚
โ”‚ โฑ 1315 โ”‚   โ”‚   self._ip = self._ip_int_from_string(addr_str)                                     โ”‚
โ”‚   1316 โ”‚                                                                                         โ”‚
โ”‚   1317 โ”‚   @property                                                                             โ”‚
โ”‚   1318 โ”‚   def packed(self):                                                                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                        โ”‚
โ”‚ โ”‚ addr_str = ''                                                         โ”‚                        โ”‚
โ”‚ โ”‚  address = ''                                                         โ”‚                        โ”‚
โ”‚ โ”‚     self = <repr-error "'IPv4Address' object has no attribute '_ip'"> โ”‚                        โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                        โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ /usr/lib/python3.11/ipaddress.py:1198 in _ip_int_from_string                                     โ”‚
โ”‚                                                                                                  โ”‚
โ”‚   1195 โ”‚   โ”‚                                                                                     โ”‚
โ”‚   1196 โ”‚   โ”‚   """                                                                               โ”‚
โ”‚   1197 โ”‚   โ”‚   if not ip_str:                                                                    โ”‚
โ”‚ โฑ 1198 โ”‚   โ”‚   โ”‚   raise AddressValueError('Address cannot be empty')                            โ”‚
โ”‚   1199 โ”‚   โ”‚                                                                                     โ”‚
โ”‚   1200 โ”‚   โ”‚   octets = ip_str.split('.')                                                        โ”‚
โ”‚   1201 โ”‚   โ”‚   if len(octets) != 4:                                                              โ”‚
โ”‚                                                                                                  โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ                                                     โ”‚
โ”‚ โ”‚    cls = <class 'ipaddress.IPv4Address'> โ”‚                                                     โ”‚
โ”‚ โ”‚ ip_str = ''                              โ”‚                                                     โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ                                                     โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
AddressValueError: Address cannot be empty

@jmrplens I have made a fix for this. Could you try v1.11.4 of the integration and let me know?

With the new version we are close, it doesnโ€™t break anymore, but now it recognises the IoT network as the guest network, I donโ€™t have the guest network activated but the IoT network, the integration recognises it the other way round:


Some logs I have seen:


2024-03-29 10:08:18.743 ERROR (MainThread) [homeassistant.config_entries] Error setting up entry http://192.168.0.2 for tplink_router
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/config_entries.py", line 504, in async_setup
    result = await component.async_setup_entry(hass, self)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tplink_router/__init__.py", line 53, in async_setup_entry
    await coordinator.async_config_entry_first_refresh()
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 283, in async_config_entry_first_refresh
    await self._async_refresh(
  File "/usr/src/homeassistant/homeassistant/helpers/update_coordinator.py", line 318, in _async_refresh
    self.data = await self._async_update_data()
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tplink_router/coordinator.py", line 72, in _async_update_data
    self.status = await self.hass.async_add_executor_job(TPLinkRouterCoordinator.request, self.router,
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tplink_router/coordinator.py", line 72, in _async_update_data
    self.status = await self.hass.async_add_executor_job(TPLinkRouterCoordinator.request, self.router,
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError
                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tplink_router/coordinator.py", line 72, in _async_update_data
    self.status = await self.hass.async_add_executor_job(TPLinkRouterCoordinator.request, self.router,
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
asyncio.exceptions.CancelledError

RX and TX stay always in 0.0.
I have one wired client, not recognised.

@jmrplens
RX and TX - are not from this integration - maybe you have enabled UPnP integration

Is there any other errors in logs?

From the json that you have posted - there is no wired client connected to Deco

For Iot network could you run this code?

from tplinkrouterc6u import TPLinkDecoClient
from logging import Logger
import json

client = TPLinkDecoClient('192.168.0.1', 'your_password', logger=Logger('test'))
client.authorize()

result = self.request('admin/wireless?form=wlan', json.dumps({'operation': 'read'}))
print(result)

Sorry, I forgot to turn on the wired device :sweat_smile: :

And the new test:

Test:

from tplinkrouterc6u import TPLinkDecoClient
from logging import Logger
import json
from rich.traceback import install
install(show_locals=True)

client = TPLinkDecoClient('192.168.0.2', 'MyPassWord', logger=Logger('test'))
client.authorize()

result = self.request('admin/wireless?form=wlan', json.dumps({'operation': 'read'}))
print(result)

Output:

python3 -m test
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ in _run_module_as_main:198                                                            โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚   alter_argv = True                                                               โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x7f54615bcff0, file "/root/test.py",     โ”‚ โ”‚
โ”‚ โ”‚                line 1>                                                            โ”‚ โ”‚
โ”‚ โ”‚ main_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f5461499dd0>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5461499dd0>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +4                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚     mod_name = 'test'                                                             โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5461499dd0>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚ in _run_code:88                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚       cached = '/root/__pycache__/test.cpython-311.pyc'                           โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x7f54615bcff0, file "/root/test.py",     โ”‚ โ”‚
โ”‚ โ”‚                line 1>                                                            โ”‚ โ”‚
โ”‚ โ”‚        fname = '/root/test.py'                                                    โ”‚ โ”‚
โ”‚ โ”‚ init_globals = None                                                               โ”‚ โ”‚
โ”‚ โ”‚       loader = <_frozen_importlib_external.SourceFileLoader object at             โ”‚ โ”‚
โ”‚ โ”‚                0x7f5461499dd0>                                                    โ”‚ โ”‚
โ”‚ โ”‚     mod_name = '__main__'                                                         โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5461499dd0>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ”‚     pkg_name = ''                                                                 โ”‚ โ”‚
โ”‚ โ”‚  run_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f5461499dd0>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5461499dd0>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +4                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚  script_name = None                                                               โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /root/test.py:10 in <module>                                                          โ”‚
โ”‚                                                                                       โ”‚
โ”‚    7 client = TPLinkDecoClient('192.168.0.2', 'MyPassWord', logger= โ”‚
โ”‚    8 client.authorize()                                                               โ”‚
โ”‚    9                                                                                  โ”‚
โ”‚ โฑ 10 result = self.request('admin/wireless?form=wlan', json.dumps({'operation': 'read โ”‚
โ”‚   11 print(result)                                                                    โ”‚
โ”‚   12                                                                                  โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚           client = <tplinkrouterc6u.client.TPLinkDecoClient object at             โ”‚ โ”‚
โ”‚ โ”‚                    0x7f545fc9ad50>                                                โ”‚ โ”‚
โ”‚ โ”‚          install = <function install at 0x7f545fc92b60>                           โ”‚ โ”‚
โ”‚ โ”‚             json = <module 'json' from '/usr/lib/python3.11/json/__init__.py'>    โ”‚ โ”‚
โ”‚ โ”‚           Logger = <class 'logging.Logger'>                                       โ”‚ โ”‚
โ”‚ โ”‚ TPLinkDecoClient = <class 'tplinkrouterc6u.client.TPLinkDecoClient'>              โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
NameError: name 'self' is not defined

Sorry, there is a mistake, Could you try this one?

from tplinkrouterc6u import TPLinkDecoClient
from logging import Logger
import json

client = TPLinkDecoClient('192.168.0.1', 'your_password', logger=Logger('test'))
client.authorize()

result = client.request('admin/wireless?form=wlan', json.dumps({'operation': 'read'}))
print(result)

Fixed this. I received a JSON

python3 -m test
{'band5_1': {'backhaul': {'channel': 48}, 'guest': {'enable': False, 'ssid': 'RWxfTWFyaWRvX0RlX05pbmE=', 'password': 'ZXhpc3RlZGV2ZXJkYWQ='}, 'host': {'password': 'UmVwdWJsaWNhPUx1Y2t5LlR5cmlvbi4yMDIxPw==', 'ssid': 'R3VheWZhaQ==', 'channel': 48, 'enable': True, 'mode': '11ac', 'channel_width': 'HT80', 'enable_hide_ssid': False}}, 'is_eg': False, 'band6': {'guest': {'enable': False, 'ssid': 'RWxfTWFyaWRvX0RlX05pbmFfNkdIeg==', 'password': ''}, 'backhaul': {'channel': 37}, 'host': {'password': 'UmVwdWJsaWNhPUx1Y2t5LlR5cmlvbi4yMDIxPw==', 'ssid': 'R3VheWZhaTY=', 'channel': 37, 'enable': False, 'mode': '11ac', 'channel_width': 'HT160', 'enable_hide_ssid': False}}, 'band2_4': {'backhaul': {'channel': 8}, 'guest': {'enable': False, 'ssid': 'RWxfTWFyaWRvX0RlX05pbmE=', 'password': 'ZXhpc3RlZGV2ZXJkYWQ='}, 'host': {'password': 'UmVwdWJsaWNhPUx1Y2t5LlR5cmlvbi4yMDIxPw==', 'ssid': 'R3VheWZhaQ==', 'channel': 8, 'enable': True, 'mode': '11ng', 'channel_width': 'HT40', 'enable_hide_ssid': False}}}

@jmrplens There is no info about IoT :frowning:
Could you login via browser to Deco and get a list of requests xhr requests?

  1. Go over to the routerโ€™s web management page (donโ€™t log in yet)
  2. Open the Inspect window > Network tab (usually by pressing F12 and then clicking on โ€œNetworkโ€)
  3. Tick the โ€œPreserve Logโ€ checkbox and set the filter to โ€œXHRโ€
  4. Login to your router
  5. Click on various buttons in the web management page
  6. Right Click on the CGI files in the Inspect windowโ€™s โ€œNetworkโ€ tab and export HAR

And what is your router hardware?

@jmrplens Do the wifi switches work?

Could you run this code please?

from tplinkrouterc6u import TPLinkDecoClient
from logging import Logger
import json

client = TPLinkDecoClient('192.168.0.1', 'your_password', logger=Logger('test'))
client.authorize()

result = client.request('admin/network?form=wan_ipv4', json.dumps({'operation': 'read'}))
print(result)

Sorry, I am away from home, but with VPN I have been able to do some tests.

The script that reads the information from the wan, works, but I only use the deco in AP mode, I donโ€™t use the router functionality:

{'wan': {'ip_info': {'mac': 'FF-FF-FF-FF-FF-02', 'dns2': '0.0.0.0', 'dns1': '0.0.0.0', 'mask': '', 'gateway': '', 'ip': ''}, 'dial_type': 'static_ip', 'info': {}}, 'lan': {'ip_info': {'mac': 'FF-FF-FF-FF-FF-01', 'mask': '255.255.255.0', 'ip': '192.168.1.1'}}}

Main Deco: XE75Pro(2.0) 1.2.9 Build 20231225 Rel. 57498
The HAR file: File

The wifi switches do not work, this is the log:

2024-03-30 02:15:27.573 ERROR (MainThread) [homeassistant.components.websocket_api.http.connection] [139907312458304] TplinkRouter - TPLinkDecoClient - An unknown response - Expecting value: line 1 column 1 (char 0); Request admin/wireless?form=wlan - Response wEH1eB/3j1McKTdOlEPmte/r4SX6t0uzGZshWQH63VH6TYgE0523AO7zLWead69S/StBcKpzQ8vyfsgCx5OgqjO7Mr9Q7N9Z0Qq5nQb0TAMyJhIHveT0lXBnuGXonTZ/ebMz1IuFUVbU7kUhyWVEWTiGfWxW4E00eCRUTVxLz1YNxbVM7NB7Rmh0dM68rEv0QAyCNS7bGfJ1ZdCOS94HDUZhvGteevOIgpy2erVdsYqxaUGVBtlpXXaUAgx/FW8cMs4HkuGrtCbjLDgzgFiXXk39ntgpMIr3te9WZSbHYllCVGMZW/fQj8h5+OaDozgZovzrHpYPKtzfkfkCadju8fN+U9S0hyfyXxBKnN300MY=
Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/components/websocket_api/commands.py", line 239, in handle_call_service
    response = await hass.services.async_call(
               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2319, in async_call
    response_data = await coro
                    ^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/core.py", line 2356, in _execute_service
    return await target(service_call)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 905, in entity_service_call
    single_response = await _handle_entity_call(
                      ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/src/homeassistant/homeassistant/helpers/service.py", line 975, in _handle_entity_call
    result = await task
             ^^^^^^^^^^
  File "/config/custom_components/tplink_router/switch.py", line 151, in async_turn_off
    await self.entity_description.method(self.coordinator, False)
  File "/config/custom_components/tplink_router/coordinator.py", line 68, in set_wifi
    await self.hass.async_add_executor_job(TPLinkRouterCoordinator.request, self.router, callback)
  File "/usr/local/lib/python3.12/concurrent/futures/thread.py", line 58, in run
    result = self.fn(*self.args, **self.kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/config/custom_components/tplink_router/coordinator.py", line 56, in request
    data = callback()
           ^^^^^^^^^^
  File "/config/custom_components/tplink_router/coordinator.py", line 66, in callback
    self.router.set_wifi(wifi, enable)
  File "/usr/local/lib/python3.12/site-packages/tplinkrouterc6u/client.py", line 459, in set_wifi
    self.request('admin/wireless?form=wlan', json.dumps({'operation': 'write', 'params': params}))
  File "/usr/local/lib/python3.12/site-packages/tplinkrouterc6u/client.py", line 110, in request
    raise ClientError(error)
tplinkrouterc6u.exception.ClientError: TplinkRouter - TPLinkDecoClient - An unknown response - Expecting value: line 1 column 1 (char 0); Request admin/wireless?form=wlan - Response wEH1eB/3j1McKTdOlEPmte/r4SX6t0uzGZshWQH63VH6TYgE0523AO7zLWead69S/StBcKpzQ8vyfsgCx5OgqjO7Mr9Q7N9Z0Qq5nQb0TAMyJhIHveT0lXBnuGXonTZ/ebMz1IuFUVbU7kUhyWVEWTiGfWxW4E00eCRUTVxLz1YNxbVM7NB7Rmh0dM68rEv0QAyCNS7bGfJ1ZdCOS94HDUZhvGteevOIgpy2erVdsYqxaUGVBtlpXXaUAgx/FW8cMs4HkuGrtCbjLDgzgFiXXk39ntgpMIr3te9WZSbHYllCVGMZW/fQj8h5+OaDozgZovzrHpYPKtzfkfkCadju8fN+U9S0hyfyXxBKnN300MY=

@jmrplens

So your Main Deco: XE75Pro is used in AP mode? What router do you use to turn on/off WiFi and to change wifi password? Is it the router with ip 192.168.0.1 ?

Could you run this code please?

from tplinkrouterc6u import TPLinkDecoClient
from logging import Logger
import json

client = TPLinkDecoClient('192.168.0.2', 'your_password', logger=Logger('test'))
client.authorize()

result = client.request('admin/device?form=mode', json.dumps({'operation': 'read'}))
print(result)

result = client.request('admin/web?form=extra_component_info', json.dumps({'operation': 'read'}))
print(result)

result = client.request('admin/component_control?form=switch_list', json.dumps({'operation': 'read'}))
print(result)

result = client.request('admin/wireless?form=iot', json.dumps({'operation': 'read'}))
print(result)

My main Deco, with which I set the password and configure the wifi is the one with the IP 192.168.0.2.

My network is like this:

Output:

Full script
python3 -m test
{'workmode': 'FAP', 'sysmode': 'AP'}
TplinkRouter - TPLinkDecoClient - Response with error; Request admin/web?form=extra_component_info - Response {'errorcode': 'no such callback', 'success': False}
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ in _run_module_as_main:198                                                            โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚   alter_argv = True                                                               โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x1f66b90, file "/root/test.py", line 1>  โ”‚ โ”‚
โ”‚ โ”‚ main_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f5153839d90>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5153839d90>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +5                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚     mod_name = 'test'                                                             โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5153839d90>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚ in _run_code:88                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚       cached = '/root/__pycache__/test.cpython-311.pyc'                           โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x1f66b90, file "/root/test.py", line 1>  โ”‚ โ”‚
โ”‚ โ”‚        fname = '/root/test.py'                                                    โ”‚ โ”‚
โ”‚ โ”‚ init_globals = None                                                               โ”‚ โ”‚
โ”‚ โ”‚       loader = <_frozen_importlib_external.SourceFileLoader object at             โ”‚ โ”‚
โ”‚ โ”‚                0x7f5153839d90>                                                    โ”‚ โ”‚
โ”‚ โ”‚     mod_name = '__main__'                                                         โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5153839d90>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ”‚     pkg_name = ''                                                                 โ”‚ โ”‚
โ”‚ โ”‚  run_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f5153839d90>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f5153839d90>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +5                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚  script_name = None                                                               โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /root/test.py:13 in <module>                                                          โ”‚
โ”‚                                                                                       โ”‚
โ”‚   10 result = client.request('admin/device?form=mode', json.dumps({'operation': 'read โ”‚
โ”‚   11 print(result)                                                                    โ”‚
โ”‚   12                                                                                  โ”‚
โ”‚ โฑ 13 result = client.request('admin/web?form=extra_component_info', json.dumps({'oper โ”‚
โ”‚   14 print(result)                                                                    โ”‚
โ”‚   15                                                                                  โ”‚
โ”‚   16 result = client.request('admin/component_control?form=switch_list', json.dumps({ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚           client = <tplinkrouterc6u.client.TPLinkDecoClient object at             โ”‚ โ”‚
โ”‚ โ”‚                    0x7f51538512d0>                                                โ”‚ โ”‚
โ”‚ โ”‚          install = <function install at 0x7f5152002a20>                           โ”‚ โ”‚
โ”‚ โ”‚             json = <module 'json' from '/usr/lib/python3.11/json/__init__.py'>    โ”‚ โ”‚
โ”‚ โ”‚           Logger = <class 'logging.Logger'>                                       โ”‚ โ”‚
โ”‚ โ”‚           result = {'workmode': 'FAP', 'sysmode': 'AP'}                           โ”‚ โ”‚
โ”‚ โ”‚ TPLinkDecoClient = <class 'tplinkrouterc6u.client.TPLinkDecoClient'>              โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /usr/local/lib/python3.11/dist-packages/tplinkrouterc6u/client.py:110 in request      โ”‚
โ”‚                                                                                       โ”‚
โ”‚    107 โ”‚   โ”‚   โ”‚   โ”‚    .format(self.__class__.__name__, path, data)) if not error el โ”‚
โ”‚    108 โ”‚   โ”‚   if self._logger:                                                       โ”‚
โ”‚    109 โ”‚   โ”‚   โ”‚   self._logger.error(error)                                          โ”‚
โ”‚ โฑ  110 โ”‚   โ”‚   raise ClientError(error)                                               โ”‚
โ”‚    111 โ”‚                                                                              โ”‚
โ”‚    112 โ”‚   def _is_valid_response(self, data: dict) -> bool:                          โ”‚
โ”‚    113 โ”‚   โ”‚   return 'success' in data and data['success'] and self._data_block in d โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚            data = {'errorcode': 'no such callback', 'success': False}             โ”‚ โ”‚
โ”‚ โ”‚           error = 'TplinkRouter - TPLinkDecoClient - Response with error; Request โ”‚ โ”‚
โ”‚ โ”‚                   admin/web?form=ex'+81                                           โ”‚ โ”‚
โ”‚ โ”‚   ignore_errors = False                                                           โ”‚ โ”‚
โ”‚ โ”‚ ignore_response = False                                                           โ”‚ โ”‚
โ”‚ โ”‚            path = 'admin/web?form=extra_component_info'                           โ”‚ โ”‚
โ”‚ โ”‚        response = <Response [200]>                                                โ”‚ โ”‚
โ”‚ โ”‚            self = <tplinkrouterc6u.client.TPLinkDecoClient object at              โ”‚ โ”‚
โ”‚ โ”‚                   0x7f51538512d0>                                                 โ”‚ โ”‚
โ”‚ โ”‚             url = 'http://192.168.0.2/cgi-bin/luci/;stok=770158b3454dbf103a61d6cโ€ฆ โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
ClientError: TplinkRouter - TPLinkDecoClient - Response with error; Request 
admin/web?form=extra_component_info - Response {'errorcode': 'no such callback', 
'success': False}
Without call to extra components

python3 -m test
{'workmode': 'FAP', 'sysmode': 'AP'}
TplinkRouter - TPLinkDecoClient - Response with error; Request admin/component_control?form=switch_list - Response {'success': True, 'data': {'show_performance': False}}
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ in _run_module_as_main:198                                                            โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚   alter_argv = True                                                               โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x25824a0, file "/root/test.py", line 1>  โ”‚ โ”‚
โ”‚ โ”‚ main_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f4a4ef5de50>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f4a4ef5de50>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +5                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚     mod_name = 'test'                                                             โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f4a4ef5de50>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚ in _run_code:88                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚       cached = '/root/__pycache__/test.cpython-311.pyc'                           โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x25824a0, file "/root/test.py", line 1>  โ”‚ โ”‚
โ”‚ โ”‚        fname = '/root/test.py'                                                    โ”‚ โ”‚
โ”‚ โ”‚ init_globals = None                                                               โ”‚ โ”‚
โ”‚ โ”‚       loader = <_frozen_importlib_external.SourceFileLoader object at             โ”‚ โ”‚
โ”‚ โ”‚                0x7f4a4ef5de50>                                                    โ”‚ โ”‚
โ”‚ โ”‚     mod_name = '__main__'                                                         โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f4a4ef5de50>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ”‚     pkg_name = ''                                                                 โ”‚ โ”‚
โ”‚ โ”‚  run_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7f4a4ef5de50>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7f4a4ef5de50>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +5                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚  script_name = None                                                               โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /root/test.py:13 in <module>                                                          โ”‚
โ”‚                                                                                       โ”‚
โ”‚   10 result = client.request('admin/device?form=mode', json.dumps({'operation': 'read โ”‚
โ”‚   11 print(result)                                                                    โ”‚
โ”‚   12                                                                                  โ”‚
โ”‚ โฑ 13 result = client.request('admin/component_control?form=switch_list', json.dumps({ โ”‚
โ”‚   14 print(result)                                                                    โ”‚
โ”‚   15                                                                                  โ”‚
โ”‚   16 result = client.request('admin/wireless?form=iot', json.dumps({'operation': 'rea โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚           client = <tplinkrouterc6u.client.TPLinkDecoClient object at             โ”‚ โ”‚
โ”‚ โ”‚                    0x7f4a4ef75350>                                                โ”‚ โ”‚
โ”‚ โ”‚          install = <function install at 0x7f4a4d72aa20>                           โ”‚ โ”‚
โ”‚ โ”‚             json = <module 'json' from '/usr/lib/python3.11/json/__init__.py'>    โ”‚ โ”‚
โ”‚ โ”‚           Logger = <class 'logging.Logger'>                                       โ”‚ โ”‚
โ”‚ โ”‚           result = {'workmode': 'FAP', 'sysmode': 'AP'}                           โ”‚ โ”‚
โ”‚ โ”‚ TPLinkDecoClient = <class 'tplinkrouterc6u.client.TPLinkDecoClient'>              โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /usr/local/lib/python3.11/dist-packages/tplinkrouterc6u/client.py:110 in request      โ”‚
โ”‚                                                                                       โ”‚
โ”‚    107 โ”‚   โ”‚   โ”‚   โ”‚    .format(self.__class__.__name__, path, data)) if not error el โ”‚
โ”‚    108 โ”‚   โ”‚   if self._logger:                                                       โ”‚
โ”‚    109 โ”‚   โ”‚   โ”‚   self._logger.error(error)                                          โ”‚
โ”‚ โฑ  110 โ”‚   โ”‚   raise ClientError(error)                                               โ”‚
โ”‚    111 โ”‚                                                                              โ”‚
โ”‚    112 โ”‚   def _is_valid_response(self, data: dict) -> bool:                          โ”‚
โ”‚    113 โ”‚   โ”‚   return 'success' in data and data['success'] and self._data_block in d โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚            data = {'success': True, 'data': {'show_performance': False}}          โ”‚ โ”‚
โ”‚ โ”‚           error = 'TplinkRouter - TPLinkDecoClient - Response with error; Request โ”‚ โ”‚
โ”‚ โ”‚                   admin/component_c'+89                                           โ”‚ โ”‚
โ”‚ โ”‚   ignore_errors = False                                                           โ”‚ โ”‚
โ”‚ โ”‚ ignore_response = False                                                           โ”‚ โ”‚
โ”‚ โ”‚            path = 'admin/component_control?form=switch_list'                      โ”‚ โ”‚
โ”‚ โ”‚        response = <Response [200]>                                                โ”‚ โ”‚
โ”‚ โ”‚            self = <tplinkrouterc6u.client.TPLinkDecoClient object at              โ”‚ โ”‚
โ”‚ โ”‚                   0x7f4a4ef75350>                                                 โ”‚ โ”‚
โ”‚ โ”‚             url = 'http://192.168.0.2/cgi-bin/luci/;stok=f4a2148ad396543c7ee1bb1โ€ฆ โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
ClientError: TplinkRouter - TPLinkDecoClient - Response with error; Request 
admin/component_control?form=switch_list - Response {'success': True, 'data': 
{'show_performance': False}}

Calling IoT form

python3 -m test
{'workmode': 'FAP', 'sysmode': 'AP'}
TplinkRouter - TPLinkDecoClient - Response with error; Request admin/wireless?form=iot - Response {'error_code': 1, 'msg': 'no such callback'}
โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ Traceback (most recent call last) โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ
โ”‚ in _run_module_as_main:198                                                            โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚   alter_argv = True                                                               โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x1430b20, file "/root/test.py", line 1>  โ”‚ โ”‚
โ”‚ โ”‚ main_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7fca49239d90>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7fca49239d90>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +5                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚     mod_name = 'test'                                                             โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7fca49239d90>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚ in _run_code:88                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚       cached = '/root/__pycache__/test.cpython-311.pyc'                           โ”‚ โ”‚
โ”‚ โ”‚         code = <code object <module> at 0x1430b20, file "/root/test.py", line 1>  โ”‚ โ”‚
โ”‚ โ”‚        fname = '/root/test.py'                                                    โ”‚ โ”‚
โ”‚ โ”‚ init_globals = None                                                               โ”‚ โ”‚
โ”‚ โ”‚       loader = <_frozen_importlib_external.SourceFileLoader object at             โ”‚ โ”‚
โ”‚ โ”‚                0x7fca49239d90>                                                    โ”‚ โ”‚
โ”‚ โ”‚     mod_name = '__main__'                                                         โ”‚ โ”‚
โ”‚ โ”‚     mod_spec = ModuleSpec(name='test',                                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7fca49239d90>, origin='/root/test.py')                           โ”‚ โ”‚
โ”‚ โ”‚     pkg_name = ''                                                                 โ”‚ โ”‚
โ”‚ โ”‚  run_globals = {                                                                  โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__name__': '__main__',                                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__doc__': None,                                               โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__package__': '',                                             โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__loader__': <_frozen_importlib_external.SourceFileLoader     โ”‚ โ”‚
โ”‚ โ”‚                object at 0x7fca49239d90>,                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__spec__': ModuleSpec(name='test',                            โ”‚ โ”‚
โ”‚ โ”‚                loader=<_frozen_importlib_external.SourceFileLoader object at      โ”‚ โ”‚
โ”‚ โ”‚                0x7fca49239d90>, origin='/root/test.py'),                          โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__annotations__': {},                                         โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__builtins__': <module 'builtins' (built-in)>,                โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__file__': '/root/test.py',                                   โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   '__cached__': '/root/__pycache__/test.cpython-311.pyc',        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   'TPLinkDecoClient': <class                                     โ”‚ โ”‚
โ”‚ โ”‚                'tplinkrouterc6u.client.TPLinkDecoClient'>,                        โ”‚ โ”‚
โ”‚ โ”‚                โ”‚   ... +5                                                         โ”‚ โ”‚
โ”‚ โ”‚                }                                                                  โ”‚ โ”‚
โ”‚ โ”‚  script_name = None                                                               โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /root/test.py:13 in <module>                                                          โ”‚
โ”‚                                                                                       โ”‚
โ”‚   10 result = client.request('admin/device?form=mode', json.dumps({'operation': 'read โ”‚
โ”‚   11 print(result)                                                                    โ”‚
โ”‚   12                                                                                  โ”‚
โ”‚ โฑ 13 result = client.request('admin/wireless?form=iot', json.dumps({'operation': 'rea โ”‚
โ”‚   14 print(result)                                                                    โ”‚
โ”‚   15                                                                                  โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚           client = <tplinkrouterc6u.client.TPLinkDecoClient object at             โ”‚ โ”‚
โ”‚ โ”‚                    0x7fca49251210>                                                โ”‚ โ”‚
โ”‚ โ”‚          install = <function install at 0x7fca479f6ac0>                           โ”‚ โ”‚
โ”‚ โ”‚             json = <module 'json' from '/usr/lib/python3.11/json/__init__.py'>    โ”‚ โ”‚
โ”‚ โ”‚           Logger = <class 'logging.Logger'>                                       โ”‚ โ”‚
โ”‚ โ”‚           result = {'workmode': 'FAP', 'sysmode': 'AP'}                           โ”‚ โ”‚
โ”‚ โ”‚ TPLinkDecoClient = <class 'tplinkrouterc6u.client.TPLinkDecoClient'>              โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ”‚                                                                                       โ”‚
โ”‚ /usr/local/lib/python3.11/dist-packages/tplinkrouterc6u/client.py:110 in request      โ”‚
โ”‚                                                                                       โ”‚
โ”‚    107 โ”‚   โ”‚   โ”‚   โ”‚    .format(self.__class__.__name__, path, data)) if not error el โ”‚
โ”‚    108 โ”‚   โ”‚   if self._logger:                                                       โ”‚
โ”‚    109 โ”‚   โ”‚   โ”‚   self._logger.error(error)                                          โ”‚
โ”‚ โฑ  110 โ”‚   โ”‚   raise ClientError(error)                                               โ”‚
โ”‚    111 โ”‚                                                                              โ”‚
โ”‚    112 โ”‚   def _is_valid_response(self, data: dict) -> bool:                          โ”‚
โ”‚    113 โ”‚   โ”‚   return 'success' in data and data['success'] and self._data_block in d โ”‚
โ”‚                                                                                       โ”‚
โ”‚ โ•ญโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€ locals โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฎ โ”‚
โ”‚ โ”‚            data = {'error_code': 1, 'msg': 'no such callback'}                    โ”‚ โ”‚
โ”‚ โ”‚           error = 'TplinkRouter - TPLinkDecoClient - Response with error; Request โ”‚ โ”‚
โ”‚ โ”‚                   admin/wireless?fo'+62                                           โ”‚ โ”‚
โ”‚ โ”‚   ignore_errors = False                                                           โ”‚ โ”‚
โ”‚ โ”‚ ignore_response = False                                                           โ”‚ โ”‚
โ”‚ โ”‚            path = 'admin/wireless?form=iot'                                       โ”‚ โ”‚
โ”‚ โ”‚        response = <Response [200]>                                                โ”‚ โ”‚
โ”‚ โ”‚            self = <tplinkrouterc6u.client.TPLinkDecoClient object at              โ”‚ โ”‚
โ”‚ โ”‚                   0x7fca49251210>                                                 โ”‚ โ”‚
โ”‚ โ”‚             url = 'http://192.168.0.2/cgi-bin/luci/;stok=3940c54366dc70ebbd314f7โ€ฆ โ”‚ โ”‚
โ”‚ โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ โ”‚
โ•ฐโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ•ฏ
ClientError: TplinkRouter - TPLinkDecoClient - Response with error; Request 
admin/wireless?form=iot - Response {'error_code': 1, 'msg': 'no such callback'}

@jmrplens I have added Total amount of IoT clients sensor. Guest wifi clients sensor will not count IoT clients

@awg Hi.
Im going to add IoT Wi-Fi network clients number for your router Archer AX3000
Could you use this client GitHub - AlexandrErohin/TP-Link-Archer-C6U: Python package for API access and management for TP-Link Routers. See supported routers list, run this code and post the output here

from tplinkrouterc6u import TplinkRouter
from logging import Logger

client = TplinkRouter('192.168.0.1', 'yourPassword', logger=Logger('test'))
client.authorize()
print(client.request('admin/smart_network?form=game_accelerator', 'operation=loadDevice'))
print('---')
print(client.request('admin/wireless?form=statistics'))

Before running that please connect your IoT clients to the router

Perfect. Now the IoT counter is working correctly.
When I get back home I will try to activate the guest network and see if it also counts guest clients correctly.

At the moment the wifi switches are still not working, I guess there is still some work to do for that.

Good work!

@jmrplens After you get the error when you press a switch - Does the wifi turn on / off despite the error?

Iโ€™ll need to sanitize data from the first print command.

The last one throws an error though:

Traceback (most recent call last):
  File "tplink.py", line 8, in <module>
    print(client.request('admin/wireless?form=statistics'))
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
TypeError: TplinkRequest.request() missing 1 required positional argument: 'data'

For the first print statement, it is an array like this:

[
    {'enableLimit': 'off', 'index': 18, 'trafficUsage': 21764814, 'deviceType': 'IoT Devices', 'remainTime': 0, 'deviceName': '***', 'key': '***', 'uploadSpeed': 0, 'onlineTime': 1244758.51, 'mac': '***', 'downloadSpeed': 0, 'deviceTag': 'iot_5G', 'isGuest': False, 'downloadLimit': 1024, 'uploadLimit': 200, 'enablePriority': False, 'txrate': 57000, 'ip': '***', 'rxrate': 72000, 'timePeriod': -1, 'speedLimitOnline': True, 'signal': -61},
    ...
]