home-assistant / home-assistant/core

TPLink Tapo Unable to Add Second H200 Hub on New Install

Open
#181,547 1 comment 0 reactions 2 assignees Claimed by @bdraco View on GitHub
integration: tplink
Dominant language
Python
Stars
90.5k
Forks
38.6k
Avg merge
1d 2h
Merged PRs (30d)
597

Description

### The problem

I'll leave this posted as the issue I experienced is unusual, although the problem has been mitigated. If I add a new H200 hub that doesn't have any sensors attached to it the issue in HA below occurs. If I add a T110 door sensor to the hub, via my iPhone, I can then add the hub to HA.

---- Original Text.
I'm using HAOS with HA 2026.9.1. I've purchased 2 H200 Hubs and I've not used Tapo on HA before. I set the first Hub up via the Tapo iPhone app and it updated itself to firmware 1.7.5. I installed the TP-Link Smart Home HA integration which detected the first H200 hub and installed correctly. I can view the first hub in HA and its associated sensor.

I then powered up a second new H200, via wired ethernet, which updated itself to firmware 1.7.5. I can access the second H200 via my iPhone. I've set a DHCP static IP for both hubs.

My iPhone's Tapo app:
Image

The TP-Link Smart Home app detects the second hub correctly:
Image

If I add the second hub I'm prompted for my TP-link credentials (which I used to add the first hub):

Image

I then receive an unknown error:

Image

If I manually add the second hub in HA I receive the same error. Both Hubs are connected to wired ethernet and are on the same vlan as HA. I've assigned static IPs, via DHCP, to both hubs. I can ping both hubs from HA without a single packet loss.

Image

I can delete and add the first hub in HA without any issues. If I delete the first hub I'm still unable to add the second hub in HA. I have third-party compatibility enabled.

### What version of Home Assistant Core has the issue?

2026.9.1

### What was the last working version of Home Assistant Core?

N/A. 2026.9.1 is the first version I've tried.

### What type of installation are you running?

Home Assistant OS

### Integration causing the issue

TP-Link Smart Home

### Link to integration documentation on our website

https://www.home-assistant.io/integrations/tplink

### Diagnostics information

_No response_

### Example YAML snippet

```yaml
None
```

### Anything in the logs that might be useful for us?

```txt
Debug logging turned on and the second hub attempted to be added to HA:

2026-09-07 13:27:59.644 DEBUG (MainThread) [kasa.device_factory] Finding protocol for 192.168.3.208
2026-09-07 13:27:59.644 DEBUG (MainThread) [kasa.device_factory] Finding protocol for DeviceFamily.SmartTapoHub
2026-09-07 13:27:59.646 DEBUG (MainThread) [kasa.device_factory] Finding transport for SMART.AES.HTTPS
2026-09-07 13:27:59.646 DEBUG (MainThread) [kasa.transports.sslaestransport] Created AES transport for 192.168.3.208
2026-09-07 13:27:59.646 DEBUG (MainThread) [kasa.device_factory] Using SmartCamDevice for SMART.TAPOHUB
2026-09-07 13:27:59.646 DEBUG (MainThread) [kasa.device] Initializing 192.168.3.208 of type
2026-09-07 13:27:59.647 DEBUG (MainThread) [kasa.protocols.smartprotocol] 192.168.3.208 multi-request-batch-1-of-1 >> '{"method":"multipleRequest","request_time_milis":xxxx,"terminal_uuid":"xxxxxx","params":{"requests":[{"method":"getDeviceInfo","params":{"device_info":{"name":["basic_info","info"]}}},{"method":"getAppComponentList","params":{"app_component":{"name":"app_component_list"}}},{"method":"getConnectionType","params":{"network":{"get_connection_type":{}}}}]}}'
2026-09-07 13:27:59.647 DEBUG (MainThread) [kasa.transports.sslaestransport] Sending handshake1...
2026-09-07 13:27:59.651 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208
2026-09-07 13:28:00.016 DEBUG (MainThread) [kasa.transports.sslaestransport] Device responded with status 200: {'error_code': -40401, 'result': {'data': {'code': -60502}}}
2026-09-07 13:28:00.017 DEBUG (MainThread) [kasa.transports.sslaestransport] Trying default credentials to 192.168.3.208
2026-09-07 13:28:00.017 DEBUG (MainThread) [kasa.transports.sslaestransport] Sending handshake1...
2026-09-07 13:28:00.017 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208
2026-09-07 13:28:00.022 DEBUG (MainThread) [kasa.httpclient] Device 192.168.3.208 received an os error, enabling sequential request delay: [Errno 32] Broken pipe
2026-09-07 13:28:00.022 DEBUG (MainThread) [kasa.protocols.smartprotocol] Device 192.168.3.208 got a connection error, will retry 3 times: ('Device connection error: 192.168.3.208: [Errno 32] Broken pipe', ClientOSError(32, 'Broken pipe'))
2026-09-07 13:28:00.023 DEBUG (MainThread) [kasa.protocols.smartprotocol] 192.168.3.208 multi-request-batch-1-of-1 >> '{"method":"multipleRequest","request_time_milis":xxxxx,"terminal_uuid":"xxxxxx","params":{"requests":[{"method":"getDeviceInfo","params":{"device_info":{"name":["basic_info","info"]}}},{"method":"getAppComponentList","params":{"app_component":{"name":"app_component_list"}}},{"method":"getConnectionType","params":{"network":{"get_connection_type":{}}}}]}}'
2026-09-07 13:28:00.023 DEBUG (MainThread) [kasa.transports.sslaestransport] Sending handshake1...
2026-09-07 13:28:00.023 DEBUG (MainThread) [kasa.httpclient] Device 192.168.3.208 waiting 0.24929504900046595 seconds to send request
2026-09-07 13:28:00.274 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208
2026-09-07 13:28:00.637 DEBUG (MainThread) [kasa.transports.sslaestransport] Device responded with status 200: {'error_code': -40401, 'result': {'data': {'code': -60502}}}
2026-09-07 13:28:00.638 DEBUG (MainThread) [kasa.transports.sslaestransport] Trying default credentials to 192.168.3.208
2026-09-07 13:28:00.638 DEBUG (MainThread) [kasa.transports.sslaestransport] Sending handshake1...
2026-09-07 13:28:00.638 DEBUG (MainThread) [kasa.httpclient] Device 192.168.3.208 waiting 0.24923605599997245 seconds to send request
2026-09-07 13:28:00.889 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208
2026-09-07 13:28:01.258 DEBUG (MainThread) [kasa.transports.sslaestransport] Device responded with status 200: {'error_code': -40413, 'result': {'data': {'code': -40401, 'encrypt_type': ['3'], 'key': 'xxxxxx', 'nonce': 'xxxx', 'device_confirm': 'xxxxxxxx'}}}
2026-09-07 13:28:01.259 DEBUG (MainThread) [kasa.transports.sslaestransport] Connected to 192.168.3.208 with default username
2026-09-07 13:28:01.259 DEBUG (MainThread) [kasa.transports.sslaestransport] Credentials match
2026-09-07 13:28:01.259 DEBUG (MainThread) [kasa.transports.sslaestransport] Performing handshake2 ...
2026-09-07 13:28:01.259 DEBUG (MainThread) [kasa.httpclient] Device 192.168.3.208 waiting 0.24938473000020167 seconds to send request
2026-09-07 13:28:01.510 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208
2026-09-07 13:28:01.878 DEBUG (MainThread) [kasa.transports.sslaestransport] Handshake2 complete ...
2026-09-07 13:28:01.878 DEBUG (MainThread) [kasa.transports.sslaestransport] Sending secure passthrough from 192.168.3.208
2026-09-07 13:28:01.879 DEBUG (MainThread) [kasa.httpclient] Device 192.168.3.208 waiting 0.2491355210004258 seconds to send request
2026-09-07 13:28:02.129 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208/stok=xxxxx/ds
2026-09-07 13:28:02.604 DEBUG (MainThread) [kasa.protocols.smartprotocol] 192.168.3.208 multi-request-batch-1-of-1 << {'error_code': 0,
'result': {'responses': [{'error_code': 0,
'method': 'getAppComponentList',
'result': {'app_component': {'app_component_list': [{'name': 'sdCard',
'version': 2},
{'name': 'setDetailLanguage',
'version': 1},
{'name': 'dateTime',
'version': 1},
{'name': 'system',
'version': 4},
{'name': 'led',
'version': 1},
{'name': 'firmware',
'version': 2},
{'name': 'account',
'version': 1},
{'name': 'quickSetup',
'version': 1},
{'name': 'hubRecord',
'version': 2},
{'name': 'deviceShare',
'version': 1},
{'name': 'siren',
'version': 2},
{'name': 'childControl',
'version': 1},
{'name': 'childQuickSetup',
'version': 1},
{'name': 'childInherit',
'version': 1},
{'name': 'deviceLoad',
'version': 1},
{'name': 'subg',
'version': 2},
{'name': 'iotCloud',
'version': 1},
{'name': 'diagnose',
'version': 1},
{'name': 'preWakeUp',
'version': 1},
{'name': 'supportRE',
'version': 1},
{'name': 'testSignal',
'version': 1},
{'name': 'dataDownload',
'version': 1},
{'name': 'testChildSignal',
'version': 1},
{'name': 'ringLog',
'version': 1},
{'name': 'support_presence_sensor',
'version': 1},
{'name': 'matter',
'version': 1},
{'name': 'localSmart',
'version': 2},
{'name': 'generalCameraManage',
'version': 1},
{'name': 'multiLensCamMgmt',
'version': 1},
{'name': 'playback',
'version': 6},
{'name': 'chime',
'version': 2},
{'name': 'hubPlayback',
'version': 1},
{'name': 'migrate',
'version': 1},
{'name': 'aovStorage',
'version': 1},
{'name': 'recordDownload',
'version': 2},
{'name': 'bindCamLimit',
'version': 1},
{'name': 'srtpWebrtc',
'version': 1},
{'name': 'fileRelay',
'version': 1}]}}},
{'error_code': 0,
'method': 'getConnectionType',
'result': {'link_type': 'ethernet'}},
{'error_code': 0,
'method': 'getDeviceInfo',
'result': {'device_info': {'basic_info': {'avatar': 'hub_h200',
'bind_status': True,
'child_num': 0,
'dev_id': 'REDACTED_xxxxxxx',
'device_alias': '#MASKED_NAME#',
'device_info': 'H200 '
'1.0',
'device_model': 'H200',
'device_name': '#MASKED_NAME#',
'device_type': 'SMART.TAPOHUB',
'has_set_location_info': 1,
'hw_id': 'REDACTED_xxxx',
'hw_version': '1.0',
'latitude': 0,
'local_ip': '192.168.3.208',
'longitude': 0,
'mac': '20-E1-5D-00-00-00',
'need_sync_sha1_password': 0,
'oem_id': 'REDACTED_xxxx',
'product_name': 'Tapo '
'Smart '
'Hub',
'region': 'EU',
'status': 'configured',
'subg_phyid': 'f863p35',
'sw_version': '1.7.5 '
'Build '
'20260806 '
'rel.18204'},
'info': {'avatar': 'hub_h200',
'bind_status': True,
'child_num': 0,
'dev_id': 'REDACTED_xxxxx',
'device_alias': '#MASKED_NAME#',
'device_info': 'H200 '
'1.0',
'device_model': 'H200',
'device_name': '#MASKED_NAME#',
'device_type': 'SMART.TAPOHUB',
'has_set_location_info': 1,
'hw_id': 'REDACTED_xxxxx',
'hw_version': '1.0',
'latitude': 0,
'local_ip': '192.168.3.208',
'longitude': 0,
'mac': '20-E1-5D-00-00-00',
'need_sync_sha1_password': 0,
'oem_id': 'REDACTED_xxxxx',
'product_name': 'Tapo '
'Smart '
'Hub',
'region': 'EU',
'status': 'configured',
'subg_phyid': 'f863p35',
'sw_version': '1.7.5 '
'Build '
'20260806 '
'rel.18204'}}}}]}}
2026-09-07 13:28:02.605 DEBUG (MainThread) [kasa.protocols.smartprotocol] 192.168.3.208 multi-request-batch-1-of-1 >> '{"method":"multipleRequest","request_time_milis":xxxx,"terminal_uuid":"xxxxxx","params":{"requests":[{"method":"getChildDeviceList","params":{"childControl":{"start_index":0}}},{"method":"getChildDeviceComponentList","params":{"childControl":{"start_index":0}}}]}}'
2026-09-07 13:28:02.605 DEBUG (MainThread) [kasa.transports.sslaestransport] Sending secure passthrough from 192.168.3.208
2026-09-07 13:28:02.606 DEBUG (MainThread) [kasa.httpclient] Device 192.168.3.208 waiting 0.22737409399996977 seconds to send request
2026-09-07 13:28:02.835 DEBUG (MainThread) [kasa.httpclient] Posting to https://192.168.3.208/stok=xxxx/ds
2026-09-07 13:28:02.889 DEBUG (MainThread) [kasa.protocols.smartprotocol] 192.168.3.208 multi-request-batch-1-of-1 << {'error_code': 0,
'result': {'responses': [{'error_code': 0,
'method': 'getChildDeviceComponentList',
'result': {'start_index': 0, 'sum': 0}},
{'error_code': 0,
'method': 'getChildDeviceList',
'result': {'start_index': 0, 'sum': 0}}]}}
2026-09-07 13:28:02.890 ERROR (MainThread) [aiohttp.server] Error handling request from 192.168.2.111
Traceback (most recent call last):
File "/usr/local/lib/python3.14/site-packages/kasa/protocols/smartprotocol.py", line 381, in _handle_response_lists
response_list_name = next(
iter(
...<5 lines>...
)
)
StopIteration

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
File "/usr/local/lib/python3.14/site-packages/aiohttp/web_protocol.py", line 575, in _handle_request
resp = await request_handler(request)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/aiohttp/web_app.py", line 559, in _handle
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/aiohttp/web_middlewares.py", line 117, in impl
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/security_filter.py", line 96, in security_filter_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/forwarded.py", line 86, in forwarded_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/request_context.py", line 24, in request_context_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/ban.py", line 88, in ban_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/auth.py", line 261, in auth_middleware
return await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/headers.py", line 39, in headers_middleware
response = await handler(request)
^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/http.py", line 92, in handle
result = await handler(request, **request.match_info)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/decorators.py", line 81, in with_admin
return await func(self, request, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/config/config_entries.py", line 248, in post
return await super().post(request, flow_id)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/http/data_validator.py", line 72, in wrapper
return await method(view, request, data, *args, **kwargs)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/helpers/data_entry_flow.py", line 118, in post
result = await self._flow_mgr.async_configure(flow_id, data)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 339, in async_configure
result = await self._async_configure(flow_id, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/config_entries.py", line 1607, in _async_configure
return await super()._async_configure(flow_id, user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 387, in _async_configure
result = await self._async_handle_step(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
flow, cur_step["step_id"], user_input
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/src/homeassistant/homeassistant/data_entry_flow.py", line 504, in _async_handle_step
result: _FlowResultT = await getattr(flow, method)(user_input)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/src/homeassistant/homeassistant/components/tplink/config_flow.py", line 233, in async_step_discovery_auth_confirm
device = await self._async_try_connect(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
self._discovered_device, credentials
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/src/homeassistant/homeassistant/components/tplink/config_flow.py", line 724, in _async_try_connect
self._discovered_device = await Device.connect(config=config)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/kasa/device.py", line 247, in connect
return await connect(host=host, config=config) # type: ignore[arg-type]
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/kasa/device_factory.py", line 80, in connect
return await _connect(config, protocol)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/kasa/device_factory.py", line 122, in _connect
await device.update()
File "/usr/local/lib/python3.14/site-packages/kasa/smart/smartdevice.py", line 271, in update
await self._negotiate()
File "/usr/local/lib/python3.14/site-packages/kasa/smartcam/smartcamdevice.py", line 222, in _negotiate
await self._initialize_children()
File "/usr/local/lib/python3.14/site-packages/kasa/smartcam/smartcamdevice.py", line 148, in _initialize_children
resp = await self.protocol.query(child_info_query)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/kasa/protocols/smartprotocol.py", line 135, in query
return await self._query(request, retry_count)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/usr/local/lib/python3.14/site-packages/kasa/protocols/smartprotocol.py", line 140, in _query
return await self._execute_query(
^^^^^^^^^^^^^^^^^^^^^^^^^^
request, retry_count=retry, iterate_list_pages=True
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.14/site-packages/kasa/protocols/smartcamprotocol.py", line 153, in _execute_query
return await self._execute_multiple_query(
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
request, retry_count, iterate_list_pages
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
)
^
File "/usr/local/lib/python3.14/site-packages/kasa/protocols/smartprotocol.py", line 300, in _execute_multiple_query
await self._handle_response_lists(
result, method, request_params, retry_count=retry_count
)
RuntimeError: coroutine raised StopIteration
```

### Additional information

I've not used Tapo on this system before, so there will be no legacy Tapo files.

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.