home-assistant / home-assistant/core
TPLink Tapo Unable to Add Second H200 Hub on New Install
- 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:
The TP-Link Smart Home app detects the second hub correctly:
If I add the second hub I'm prompted for my TP-link credentials (which I used to add the first hub):
I then receive an unknown error:
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.
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
Assessment
This issue has not been assessed yet.