Just a note, not an issue. If someone wonders why the H200 Hub will not work with python-Kasa, I have discovered that the H200 Hub uses the same security protocol as the Tapo Cameras (and is not compatible with python-Kasa). Below is the port 20002 discovery data for the H200 (from one of my Hubitat users). This is the same as on the Tapo Kamera.
It should be the same protocol within the this library, module discovery.py. (I use my own based on the groovy language.) See line 193, 194 then follow the code from there. It is parsed differently since the json details are different *(and VERY similar to the Tapo Camera discovery using same discovery).
I think that without the limits of the Hubitat UDP limitations (1024), you may be able to decrypt the json data element using the sent key and the returned key. the Hubitat UDP implementation only takes one return packet; therefore, truncating the message at 1024 bytes.
The handshake / encryption code is DIFFERENT from in this library (verified by a user not being able to control using the code). I believe that this is a version of the handshake/encryption for the TAPO camera. Some evidence for this - but I do not yet have an H200 to fully validate. That code is in the library "https://github.com/JurajNyiri/pytapo". That code supports devices with both legacy encryption as well as the new encryption scheme (called "secure" in the code block.
H200 will then connect to the new "sub-g" cameras and existing "sub-g" sensors that Tapo is selling (no direct wifi for the camera). It provides a camera local hub and a low-power interface to the camera itself.
I just set up a Home Assistant instance and noticed that the H200 isn't supported, so if there's any way I can help I'd like to. I have a bunch of devices connected to it that I'd like to get data from.
@SirWaddles feel free to check out #1165, it implements the protocol spoken by (at least some) cameras and it is apparently the same as what that hub uses as told by DaveGut. You can try to force that transport by passing --device-family SMART.IPCAMERA to your command, so I'd try something like kasa --device-family SMART.IPCAMERA --host <addr> --username <email> --password <pw> and play with command command to see if you can figure out what command set is being used.
I may very well be doing something wrong, but I had no such luck. I checked out the PR and ran:
uv run kasa --host 192.168.50.198 --username 00 --password 00 --debug
DEBUG [DISCOVERY] 192.168.50.198 >> {'system': {'get_sysinfo': {}}} discover.py:228
DEBUG Waiting a total of 5 seconds for responses... discover.py:474
Raised error: Timed out getting discovery response for 192.168.50.198
....
File "E:\GitHub\kasa\python-kasa\kasa\discover.py", line 490, in discover_single
raise TimeoutError(f"Timed out getting discovery response for {host}")
TimeoutError: Timed out getting discovery response for 192.168.50.198
So I have found with the camera that it times out first time on discovery so I just run it again. I’m not completely sure about the options that’ll work out the box for a hub but you may need to add —encrypt-type AES —ssl -df SMART.IPCAMERA but I suspect we need to make some tweaks to make it work with the cli.
Does kasa discover (w/o defining --host) work? It would be great to see the response payload, if it's working. Note, that you can also use --debug to see more low-level details on what's being sent and received.
discover just returns a lot of information on the other devices on the network even though I'm providing a host - none of it even mentions the IP address of the hub.
With the parameters @sdb9696 gave, I get a different result though.
kasa --host 192.168.50.198 --username 00 --password 00 --debug --device-family SMART.IPCAMERA --encrypt-type AES --ssl
DEBUG Created AES transport for 192.168.50.198 sslaestransport.py:142
DEBUG Initializing 192.168.50.198 of type <class 'kasa.experimental.smartcamera.SmartCamera'> device.py:198
DEBUG 192.168.50.198 multi-request-batch-1-of-1 >> smartprotocol.py:185
'{"method":"multipleRequest","request_time_milis":1728941709858,"terminal_uuid":"9aQzup6WF
+Kq4VqMrAdNkQ==","params":{"requests":[{"method":"getDeviceInfo","params":{"device_info":{
"name":["basic_info"]}}}]}}'
DEBUG Will perform handshaking... sslaestransport.py:325
DEBUG Posting to https://192.168.50.198 httpclient.py:87
DEBUG Device responded with: {'error_code': -40401, 'result': {'data': {'code': -60502}}} sslaestransport.py:345
WARNING Device 192.168.50.198 received unknown error code: -40401 sslaestransport.py:166
DEBUG Unable to query the device: 192.168.50.198, not retrying: Unable to complete handshake: smartprotocol.py:145
192.168.50.198: INTERNAL_UNKNOWN_ERROR(-100000) (error_code=INTERNAL_UNKNOWN_ERROR)
Raised error: Unable to complete handshake: 192.168.50.198: INTERNAL_UNKNOWN_ERROR(-100000)
(error_code=INTERNAL_UNKNOWN_ERROR)
40401 is something to do with the handshake not completing and the device forcing you to wait for a period of time before it will start handshake again. I think you can reboot it to clear this. My discord username is sdb9696 although I am going to bed now and will check it in the am.
It’s supported in the master branch. 0.8 should be released in the coming days. The only problem is we don’t have any examples of the H200 with connected battery cameras. I don’t suppose you have any?
So far we haven't been able to test the H200 with a connected camera device so this would actually be very helpful. Currently it won't show your camera in HA. Are you able to hmu on discord with the same username sdb9696?
Activity
sdb9696 commented on Oct 11, 2024
Hi @DaveGut, do you know what the discovery query looks like to get this response?
DaveGut commented on Oct 11, 2024
It should be the same protocol within the this library, module discovery.py. (I use my own based on the groovy language.) See line 193, 194 then follow the code from there. It is parsed differently since the json details are different *(and VERY similar to the Tapo Camera discovery using same discovery).
I think that without the limits of the Hubitat UDP limitations (1024), you may be able to decrypt the json data element using the sent key and the returned key. the Hubitat UDP implementation only takes one return packet; therefore, truncating the message at 1024 bytes.
The handshake / encryption code is DIFFERENT from in this library (verified by a user not being able to control using the code). I believe that this is a version of the handshake/encryption for the TAPO camera. Some evidence for this - but I do not yet have an H200 to fully validate. That code is in the library "https://github.com/JurajNyiri/pytapo". That code supports devices with both legacy encryption as well as the new encryption scheme (called "secure" in the code block.
H200 will then connect to the new "sub-g" cameras and existing "sub-g" sensors that Tapo is selling (no direct wifi for the camera). It provides a camera local hub and a low-power interface to the camera itself.
sdb9696 commented on Oct 11, 2024
That’s really helpful thanks. So I’ve been working on getting the “camera” protocol working, do you have an H200 you can test with when it’s ready?
SirWaddles commented on Oct 14, 2024
I just set up a Home Assistant instance and noticed that the H200 isn't supported, so if there's any way I can help I'd like to. I have a bunch of devices connected to it that I'd like to get data from.
rytilahti commented on Oct 14, 2024
@SirWaddles feel free to check out #1165, it implements the protocol spoken by (at least some) cameras and it is apparently the same as what that hub uses as told by DaveGut. You can try to force that transport by passing --device-family SMART.IPCAMERA to your command, so I'd try something like kasa --device-family SMART.IPCAMERA --host <addr> --username <email> --password <pw> and play with command command to see if you can figure out what command set is being used.
sdb9696 commented on Oct 14, 2024
Yes, as per @rytilahti, we’re trying to work on this. It would be great to hook up on discord and see if we can test this PR with your H200.
SirWaddles commented on Oct 14, 2024
I may very well be doing something wrong, but I had no such luck. I checked out the PR and ran:
uv run kasa --host 192.168.50.198 --username 00 --password 00 --debug DEBUG [DISCOVERY] 192.168.50.198 >> {'system': {'get_sysinfo': {}}} discover.py:228 DEBUG Waiting a total of 5 seconds for responses... discover.py:474 Raised error: Timed out getting discovery response for 192.168.50.198 .... File "E:\GitHub\kasa\python-kasa\kasa\discover.py", line 490, in discover_single raise TimeoutError(f"Timed out getting discovery response for {host}") TimeoutError: Timed out getting discovery response for 192.168.50.198sdb9696 commented on Oct 14, 2024
So I have found with the camera that it times out first time on discovery so I just run it again. I’m not completely sure about the options that’ll work out the box for a hub but you may need to add —encrypt-type AES —ssl -df SMART.IPCAMERA but I suspect we need to make some tweaks to make it work with the cli.
rytilahti commented on Oct 14, 2024
Does kasa discover (w/o defining --host) work? It would be great to see the response payload, if it's working. Note, that you can also use --debug to see more low-level details on what's being sent and received.
SirWaddles commented on Oct 14, 2024
discover just returns a lot of information on the other devices on the network even though I'm providing a host - none of it even mentions the IP address of the hub.
With the parameters @sdb9696 gave, I get a different result though.
kasa --host 192.168.50.198 --username 00 --password 00 --debug --device-family SMART.IPCAMERA --encrypt-type AES --ssl DEBUG Created AES transport for 192.168.50.198 sslaestransport.py:142 DEBUG Initializing 192.168.50.198 of type <class 'kasa.experimental.smartcamera.SmartCamera'> device.py:198 DEBUG 192.168.50.198 multi-request-batch-1-of-1 >> smartprotocol.py:185 '{"method":"multipleRequest","request_time_milis":1728941709858,"terminal_uuid":"9aQzup6WF +Kq4VqMrAdNkQ==","params":{"requests":[{"method":"getDeviceInfo","params":{"device_info":{ "name":["basic_info"]}}}]}}' DEBUG Will perform handshaking... sslaestransport.py:325 DEBUG Posting to https://192.168.50.198 httpclient.py:87 DEBUG Device responded with: {'error_code': -40401, 'result': {'data': {'code': -60502}}} sslaestransport.py:345 WARNING Device 192.168.50.198 received unknown error code: -40401 sslaestransport.py:166 DEBUG Unable to query the device: 192.168.50.198, not retrying: Unable to complete handshake: smartprotocol.py:145 192.168.50.198: INTERNAL_UNKNOWN_ERROR(-100000) (error_code=INTERNAL_UNKNOWN_ERROR) Raised error: Unable to complete handshake: 192.168.50.198: INTERNAL_UNKNOWN_ERROR(-100000) (error_code=INTERNAL_UNKNOWN_ERROR)Happy to talk more on Discord.
sdb9696 commented on Oct 14, 2024
40401 is something to do with the handshake not completing and the device forcing you to wait for a period of time before it will start handshake again. I think you can reboot it to clear this. My discord username is sdb9696 although I am going to bed now and will check it in the am.
willis1203 commented on Nov 22, 2024
When will it be supported the H200 Hub by python-kasa?
sdb9696 commented on Nov 22, 2024
It’s supported in the master branch. 0.8 should be released in the coming days. The only problem is we don’t have any examples of the H200 with connected battery cameras. I don’t suppose you have any?
bomba5 commented on Nov 27, 2024
I have an H200 with a D230S1 Video Doorbell and I am available to test. I can't wait to integrate this to home assistant.
sdb9696 commented on Nov 27, 2024
So far we haven't been able to test the H200 with a connected camera device so this would actually be very helpful. Currently it won't show your camera in HA. Are you able to hmu on discord with the same username sdb9696?
sdb9696 commented on Nov 29, 2024
@bomba5 ?
rytilahti commented on Dec 1, 2024
@DaveGut the newest release (0.8.0) added support for H200. Could you confirm if it is now working for you, and close this issue, if so?
sdb9696 commented on Dec 17, 2024
H200 hub now supported
Prepare 0.9.0 (#1401)
Prepare 0.9.0 (python-kasa#1401)
Prepare 0.9.0 (python-kasa#1401)
Prepare 0.9.0 (python-kasa#1401)
Prepare 0.9.0 (python-kasa#1401)
Prepare 0.9.0 (python-kasa#1401)