GV

GeezerVison

The World Wide Web, restored to 800 pixels of glory.

Home|About|Gaming cabinet|Archives|How it works|Starter sites

On this site

  • Sign in
  • ActionsCI/CD and automation
  • CodespacesCloud development environments
  • All Features
  • Documentation
  • Training
  • Certifications
  • Build with Copilot
  • Customize Copilot
  • Integrations
  • Trending repos
  • GitHub Sponsors
  • Developer articles
  • Enterprises

This view

  • Original page
  • New address

GeezerVison is showing github.com — fix: use KLAP v2 transport for IOT devices with login version 2 by bm1549 · Pull Request #1731 · python-kasa/python-kasa

Conversation

@bm1549

@bm1549 bm1549 commented Jul 26, 2026

Copy link
Copy Markdown
Contributor

Summary

Some IOT-family devices keep the legacy IOT command set after a firmware
update but upgrade their KLAP authentication to login version 2 (sha256
hashing). get_protocol maps every IOT.KLAP device to the v1
KlapTransport (md5 hashing), so the handshake response never matches and
authentication fails with:

Device response did not match our challenge on ip <x>, check that your
e-mail and password (both case-sensitive) are correct.

This affects at least the EP10 plug and the HS300 power strip once their
firmware advertises login_version: 2.

Fix

Select KlapTransportV2 for IOT.KLAP devices that advertise
login_version >= 2, matching the transport already used for SMART.KLAP.
Devices with login version 1 (or unset) are unchanged and continue to use the
v1 KlapTransport.

Testing

Verified against a real EP10(US) smart plug running firmware
1.1.1 Build 250908, which advertises IOT.SMARTPLUGSWITCH / KLAP /
login_version: 2 in its discovery result:

  • Before: IotProtocol + KlapTransport (v1/md5) → handshake fails with
    the "did not match our challenge" error.
  • With KlapTransportV2 (v2/sha256): the same credentials authenticate
    and a full update() returns valid get_sysinfo state.
  • After the fix: get_protocol() selects KlapTransportV2 for this
    device and update() succeeds end to end.

Added a test_get_protocol parametrization (iot-klap-v2) asserting that
IOT.KLAP with login_version=2 resolves to IotProtocol +
KlapTransportV2, while the existing login-version-1 case still resolves to
KlapTransport. Full test_get_protocol suite passes; ruff check and
ruff format are clean.

Fixes home-assistant/core#177207

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

fisherbrad922-alt, conyeje2, valueproposition, rspadola, kishenpatel, chriscubellis, crankynetmaam, crisrs07, ConditionalException, LlemonDuck, and 28 more reacted with thumbs up emoji
All reactions
  • 👍 38 reactions
@bm1549 bm1549 mentioned this pull request Jul 26, 2026
TP-Link HS300 fails authentication with "Device response did not match our challenge" after 2026.7.4 update — resolved by rolling back to 2026.7.3 home-assistant/core#177207
Closed
@codecov

codecov Bot commented Jul 26, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 93.30%. Comparing base (a29d061) to head (ff11447).

Additional details and impacted files
@@            Coverage Diff             @@
##           master    #1731      +/-   ##
==========================================
+ Coverage   93.29%   93.30%   +0.01%     
==========================================
  Files         157      157              
  Lines        9932     9934       +2     
  Branches     1022     1023       +1     
==========================================
+ Hits         9266     9269       +3     
  Misses        471      471              
+ Partials      195      194       -1     

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bm1549
bm1549 force-pushed the fix/iot-klap-login-v2 branch from e5fd5d7 to 168336b Compare July 26, 2026 04:12
@bm1549 @claude
fix: use KLAP v2 transport for IOT devices with login version 2
ff11447
Some IOT-family devices (e.g. the EP10 plug and HS300 strip) keep the
legacy IOT command set after a firmware update but upgrade their KLAP
authentication to login version 2 (sha256 hashing). The device factory
mapped every IOT.KLAP device to the v1 KlapTransport (md5 hashing), so
the handshake response never matched and authentication failed with
"Device response did not match our challenge".

Select KlapTransportV2 for IOT.KLAP devices that advertise login
version >= 2, matching the transport already used for SMART.KLAP.

Co-Authored-By: Claude Opus 4.8 <[email protected]>
@bm1549
bm1549 force-pushed the fix/iot-klap-login-v2 branch from 168336b to ff11447 Compare July 26, 2026 04:13
@emmjaibi

emmjaibi commented Aug 2, 2026

Copy link
Copy Markdown

Thanks for tracking this down and helping to figure out what is going on. I can confirm the underlying "IOT.KLAP hardcoded to v1" bug is real and matches what I'm seeing on two HS103(US) units, HW Ver 5.0.

However, I don't think login_version alone is sufficient to pick the right transport, and this patch as written would regress previously-working devices. Here's the evidence:

Device A — HS103(US), HW 5.0, freshly factory-reset and re-paired today (post Android Kasa app update):

json
"mgt_encrypt_schm": {
  "encrypt_type": "KLAP",
  "new_klap": 1,
  "ANS": false,
  "http_port": 80,
  "lv": 2
}

Fails against stock 0.10.2 (KlapTransport/v1/md5) with the "did not match our challenge" error. Succeeds once patched to force KlapTransportV2 — matches your PR's finding exactly.

Device B — same model/hardware/firmware generation (HS103(US), HW 5.0), same TP-Link account, paired months ago, working correctly against stock 0.10.2 (KlapTransport/v1/md5) until today:

json
"mgt_encrypt_schm": {
  "encrypt_type": "KLAP",
  "new_klap": 1,
  "ANS": true,
  "http_port": 80,
  "lv": 2
}

Identical new_klap/lv values to Device A. After applying this patch (forcing KlapTransportV2 for any IOT.KLAP + lv >= 2), Device B now fails authentication with the same error — it needs the old v1/md5 transport, not v2.

So both devices advertise the same discovery-time capability flags, but apparently have different actual stored credential hashes on-device (presumably determined by whichever app/firmware version was used at the time each device was originally paired, not by current firmware capability). Discovery doesn't expose anything that distinguishes them (Device B has a real owner hash, Device A didn't until re-pairing), but I don't know if that's the case always or just coincidental to my specific case.

Given that, a static login_version-based rule can't safely choose the transport for both cases because it always breaks one class of device or the other. What about trying the try_connect_all() brute-force approach mentioned in the original analysis (trying both v1 and v2 and using whichever succeeds), rather than a single discovery-time decision?

I'm now annoyingly stuck with one new device happily working with the patched version, or the original one working with the stock code. Both bought and shipped in same 2-pack box! :) So silly.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@emmjaibi

emmjaibi commented Aug 2, 2026

Copy link
Copy Markdown

BTW - I removed the Device B (originally paired months ago) which had failed with patch in place using KASA App. I then re-added the device via Kasa App and the patched version now works correctly. So now both Device A and B are working with your patched version. Seems the time the device is initialized plays a role in compatibility with the protocol/authentication changes.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@iamteedoh iamteedoh mentioned this pull request Aug 5, 2026
KLAP v2 Authentication Failure on TP-Link HS300 (US) — Hardware Version 2.0 #1604
Open
@iamteedoh

iamteedoh commented Aug 5, 2026

Copy link
Copy Markdown

Confirmed this fixes the handshake on two HS300(US) hw2.0 units (fw 1.1.2 Build 241220,
IOT.SMARTPLUGSWITCH / KLAP / login_version: 2). Thanks for tracking it down.

Heads up that multi outlet strips need a second fix on top of this one: with the V2 transport
selected they authenticate fine, but get_device_class_from_family() returns IotPlug for
IOT.SMARTPLUGSWITCH, so an HS300 is driven as a single plug and every outlet dies on
KeyError: 'relay_state'. The strip aware get_device_class_from_sys_info() path is gated on
XorTransport in _connect(), so KLAP devices never reach it.

Details and a verified local fix here: #1604 (comment)

Not asking you to widen this PR. I'm just flagging so it doesn't look unfixed for strip owners
once this lands.

rspadola reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@ophirr

ophirr commented Aug 13, 2026

Copy link
Copy Markdown

Confirming this fixes HS103(US) hw 5.0 on firmware 1.1.3 Build 250908 Rel.112508.

Before (stock python-kasa, via Home Assistant 2026.8.1)

Both plugs stopped working immediately after a firmware update offered by the Kasa
app, and continued to work in the Kasa app throughout. Home Assistant’s config flow
failed with:

Device response did not match our challenge on ip 192.168.4.52,
check that your e-mail and password (both case-sensitive) are correct.

The credentials were correct. Deleting and re-adding the integration,
re-provisioning the plugs in the Kasa app, and disabling account 2FA all made no
difference, which is consistent with the transport rather than the secret being
wrong.

The coordinator error before the entries were removed is a useful signature, since
it distinguishes this from a WiFi problem. It is ECONNREFUSED, not a timeout:

Unable to connect to the device: 192.168.4.52:9999:
[Errno 111] Connect call failed ('192.168.4.52', 9999)
Discovery fingerprint

Unauthenticated discovery already reports the deciding field, so this needs no
credentials to reproduce:

192.168.4.52 IotSmartPlugSwitch Klap login_version = 2
192.168.4.33 IotSmartPlugSwitch Klap login_version = 2
192.168.4.222 IotSmartPlugSwitch Xor login_version = None <- control

After (this PR’s head)

Installed with:

pip install "git+https://github.com/python-kasa/python-kasa.git@refs/pull/1731/head"
Both plugs authenticate and land on the v2 transport:

XXX1 HS103 hw5.0 sw 1.1.3 Build 250908 Klap lv=2 KlapTransportV2 OK
XXX2 HS103 hw5.0 sw 1.1.3 Build 250908 Klap lv=2 KlapTransportV2 OK
XXX3 HS103 hw3.0 sw 1.0.4 Build 210414 Xor lv=n/a XorTransport OK

The third line is a control on the same model at an older hardware revision and
legacy firmware. It still selects XorTransport and still works, so the change
does not disturb pre-KLAP devices on the same network.

Scope of this report

Two single-outlet plugs only. This does not exercise the multi-outlet strip
behaviour raised earlier in the thread, and says nothing about the
credential-initialisation-timing question, since I only have devices that are
consistent at discovery time.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@luxardolabs luxardolabs mentioned this pull request Aug 30, 2026
IOT devices connected over KLAP are always built as IotPlug, never IotStrip — HS300 loses all child sockets #1748
Open
@Als-Pal

Als-Pal commented Sep 2, 2026

Copy link
Copy Markdown

Confirming this on two further devices, and verifying the fix end to end in Home Assistant.

Devices. Both are legacy Kasa units whose firmware migrated them to KLAP — port 9999 is closed, only 80 is open:

Model HW FW Discovery
KL125(US) 4.0 1.0.5 Build 230613 Rel.151643 IOT.SMARTBULB / KLAP / login_version=2
HS200(US) 5.0 1.0.11 Build 230908 Rel.160526 IOT.SMARTPLUGSWITCH / KLAP / login_version=2

That adds a bulb to the plug/strip cases already reported (EP10, HS300), so this isn't confined to the switch family.

Hash-level confirmation, before patching anything. Running handshake1 once per device and comparing the returned server_hash offline against all four auth-hash / seed-hash pairings, using a known-correct password:

device A   MATCH via  v2 auth (sha256(sha1(u)+sha1(p)))  +  v2 seed (sha256(local+remote+auth))
device B   MATCH via  v2 auth                            +  v2 seed

No v1 pairing matched on either device, and a deliberately wrong password matched nothing (so the comparison isn't degenerate). Worth noting explicitly: perform_handshake1 already falls back to DEFAULT_CREDENTIALS and blank credentials before raising, and both were tried and failed — this is not a default-credential case.

End to end in Home Assistant 2026.8.3 with python-kasa 0.10.2, applying this PR's selection logic as a runtime patch:

before:  IOT.SMARTBULB        KLAP lv=2  ->  KlapTransport      config entry: setup_error
         IOT.SMARTPLUGSWITCH  KLAP lv=2  ->  KlapTransport      config entry: setup_error
after:   IOT.SMARTBULB        KLAP lv=2  ->  KlapTransportV2    config entry: loaded
         IOT.SMARTPLUGSWITCH  KLAP lv=2  ->  KlapTransportV2    config entry: loaded

Both then authenticated with the account's real password on the first attempt, and their entities report live state (on/off, energy). So IotProtocol over the v2 handshake drives the IOT command layer correctly — these do not need promoting to SmartProtocol. A same-network IOT.SMARTBULB / XOR device was unaffected, and SMART.TAPOPLUG / KLAP / lv=2 devices continued to resolve via the existing SMART.KLAP mapping.

One note for anyone patching downstream while this is unmerged: kasa/discover.py imports get_protocol with a from-import, binding its own reference at import time. Monkeypatching kasa.device_factory.get_protocol alone does not affect the discovery path — kasa.discover.get_protocol has to be patched as well.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@anabelle anabelle mentioned this pull request Sep 4, 2026
P115: KLAP handshake1 succeeds but credentials match neither v1 nor v2 derivations (survives factory reset) #1752
Open
@smashedr smashedr mentioned this pull request Sep 4, 2026
TP-Link authentication challenge mismatch persists on Core 2026.8.3 home-assistant/core#180229
Closed
@mitchwebster mitchwebster mentioned this pull request Sep 4, 2026
Support new_klap IoT devices #1580
Closed
@davebco

davebco commented Sep 4, 2026

Copy link
Copy Markdown

Independent confirmation of the root cause, from outside python-kasa, in case it helps de-risk the static login_version >= 2 -> KlapTransportV2 decision.

I reproduced the handshake against a KL125(US) (hw 4.0, fw 1.0.6 Build 240719) with a minimal from-scratch client (no python-kasa). POST /app/handshake1 returns 200 + 48 bytes (16-byte remote seed + 32-byte server hash), and the server hash matches:

sha256(local_seed + remote_seed + sha256(sha1(username) + sha1(password))) — i.e. KLAP v2 — and does not match the md5/v1 construction. So on new-firmware IOT.KLAP devices it's unambiguously v2 at the protocol level.

Re: the "same signature, different transport needed" observation (@emmjaibi) — on our devices the stored credential is the TP-Link cloud password captured at provisioning time. Changing the cloud password afterward does not propagate to the device; auth keeps failing until the device is removed/re-added in the Kasa app. That re-pair is likely why device B started working, and it's a credential-freshness axis separate from the v1/v2 choice — some apparent-v1 successes may be stale-credential coincidences rather than true v1 devices.

Also affected, same pattern: HS103(US) hw 5.0, fw 1.0.13 Build 240117.

Happy to run the branch against these two firmwares if another confirmation helps. Thanks for the fix.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@daharoni

daharoni commented Sep 5, 2026 •
edited
Loading

Uh oh!

There was an error while loading. Please reload this page.

Copy link
Copy Markdown

Confirming this PR on KL125(US) hw 4.0, fw 1.1.1 (IOT.SMARTBULB / KLAP /
login_version=2, new_klap: 1) — and reporting a second, separate axis that I think
explains the conflicting v1-vs-v2 reports earlier in this thread.

ANS at discovery appears to indicate provisioning freshness

Four bulbs, one account, one firmware, password string constant throughout. I re-paired
one bulb in the Kasa app (remove + re-add) and changed nothing else, then compared
each device's handshake1 server hash offline against 33 auth-hash recipes x 8
seed layouts:

Device ANS at discovery handshake1 match
3x HS200(US) SMART.KASASWITCH (already working — positive control) – v2
KL125 — re-paired in Kasa app false v2
KL125 — untouched true no match (264 combos)
KL125 — untouched true no match (264 combos)
KL125 — untouched true no match (264 combos)

v2 being auth_hash = sha256(sha1(u)+sha1(p)) and
handshake1 = sha256(local_seed + remote_seed + auth_hash).

So these bulbs are unambiguously v2 at the protocol level, matching @davebco and
@Als-Pal. But three of the four could not authenticate with any recipe until they
were re-paired — they hold a stale secret (an older password, or a token), and no
transport choice can help them.

ANS flipped true -> false on the one I re-paired, and it is readable from the
unauthenticated UDP 20002 discovery response. @emmjaibi wrote that "discovery doesn't
expose anything that distinguishes" Device A (freshly re-paired, worked on v2) from
Device B (stale, appeared to need v1) — the JSON quoted in that comment has
"ANS": false on A and "ANS": true on B, matching this pattern.

If that generalises:

  • ANS: true on an IOT.KLAP device predicts auth failure regardless of transport;
    the remedy is a re-pair in the Kasa app, not a library change.
  • login_version alone is a sound basis for the transport decision here, and
    apparent "v1 devices" may be stale-credential artifacts — which is what @davebco
    suggested.
  • A hint in the AuthenticationError message ("if this device was paired long ago,
    remove and re-add it in the Kasa app") would save people a lot of time. These bulbs
    ran unauthenticated XOR on port 9999 for years, so their KLAP secret had never been
    exercised until the firmware switched protocols.

Scope. Four bulbs, one account, one firmware. I did not reproduce @emmjaibi's case
of a stale device succeeding on v1 — mine match neither v1 nor v2 while stale.
Whether ANS carries this meaning on other models needs confirmation from people with
different hardware. I still have three untouched stale devices and am happy to run
specific measurements on them before I re-pair them.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@adam8833

adam8833 commented Sep 6, 2026

Copy link
Copy Markdown

Adding another confirmed device to this thread, from #1754.

Device: HS200(US), HW 5.0, firmware 1.1.2

Same signature as everyone else here:

Device response did not match our challenge on ip 10.0.20.51, check that your e-mail and password (both case-sensitive) are correct.

Traceback confirms the same iotdevice → iotprotocol → klaptransport.perform_handshake1 path (full trace in #1754).

Relevant to the "stale secret vs. transport" discussion upthread: this device was fully factory reset and freshly re-paired in the Tapo app under the same account (to rule out a stale/pre-KLAP credential per the theories above), and the failure was identical immediately after a fresh pairing — so in this case it does look like the transport selection itself, not credential staleness, is the blocker. Happy to test refs/pull/1731/head against it and report back if that's useful data, since I have Home Assistant OS console access to the container.

A sibling HS200(US) HW 5.0 on firmware 1.0.11 (older, pre-regression) continues to work fine on stock 0.10.2, so this is isolated to the newer firmware picking up login_version: 2 while get_protocol still pins it to v1.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@adam8833 adam8833 mentioned this pull request Sep 6, 2026
HS200 (US) HW 5.0 firmware 1.1.2 fails KLAP auth ("Device response did not match our challenge") even after factory reset with confirmed-correct credentials #1754
Closed
@bm1549

bm1549 commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Folks, we don't need more verified reproductions. Please just upvote the issue without commenting since the comments generate noise

ophirr reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@tnummy

tnummy commented Sep 11, 2026

Copy link
Copy Markdown

This branch DID fix my issue on an HS200 that wasn't integrating.

This did NOT seem to fix my other issues. Particularly on EP10 Kasa smart plugs (the plug in kind, not the outlet kind)

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@tnummy

tnummy commented Sep 12, 2026

Copy link
Copy Markdown

Also did NOT fix the issue with the KS200M motion sensor switches

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bm1549

bm1549 commented Sep 12, 2026

Copy link
Copy Markdown
Contributor Author

@tnummy yes, this is by design. This intends to fix a single error that I was able to reproduce on my device. This is not a "fix everything" PR

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@tnummy

tnummy commented Sep 13, 2026

Copy link
Copy Markdown

@bm1549 that's fine. I'm just adding context.

I figured the issue would be similar across the kasa family of products but it doesn't seem that's the case.

More importantly, it did NOT fix the authentication issue for my EP10 smart plugs, which seems to be the specific issue you were targeting to fix.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@bm1549

bm1549 commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author

More importantly, it did NOT fix the authentication issue for my EP10 smart plugs, which seems to be the specific issue you were targeting to fix.

@tnummy the specific fix here is targeting previously working EP10 smart plugs that started failing as a result of the new firmware update. Any other failures are out of scope for this change

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@dyllan-p

dyllan-p commented Sep 17, 2026

Copy link
Copy Markdown

Field results for six KLAP / lv: 2 / new_klap: 1 IOT devices, including one KL125 HW 4.0 with an intermittent device-side fault, are in #1580 here: #1580 (comment). All six authenticate with the NEW_KLAP path; may be useful to confirm the login_version selection covers the same set.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@tnummy

tnummy commented Sep 22, 2026

Copy link
Copy Markdown

@bm1549

I fixed it broadly https://github.com/tnummy/homeassistant-kasa-klap-fix

All my devices work perfectly now.

All reactions

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@fzs122

fzs122 commented Sep 23, 2026

Copy link
Copy Markdown

@tnummy
Thanks for this, it fixed the KLAP auth failures on two Kasa devices (an HS103 and a KP115) that had been stuck in "Authentication expired" for days. Both reauthenticated successfully after installing the patch and I can confirm the fallback is working as described.

One minor thing worth flagging: on startup I saw this in the logs, repeated 3 times then stopped:

Detected blocking call to listdir with args ('/config/deps/lib/python3.14/site-packages',) inside the event loop by custom integration 'kasa_klap_fix' at custom_components/kasa_klap_fix/patch.py, line 38

Not a functional problem since it only fired at startup and everything worked fine after, but might be worth wrapping that listdir call in hass.async_add_executor_job() to keep it off the event loop and clear the warning.

Appreciate you putting this together, saved me from waiting on the upstream python-kasa fix.

tnummy reacted with heart emoji
All reactions
  • ❤️ 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@ophirr

ophirr commented Sep 23, 2026 via email

Copy link
Copy Markdown
Likewise appreciated! Works great. Sent via Superhuman ( https://superhuman.com/refer/g9j5g01b?utm_medium=signature&utm_source=product )
…
On Wed, Sep 23, 2026 at 10:55 AM, fzs122 < ***@***.*** > wrote: *fzs122* left a comment (python-kasa/ python-kasa#1731) ( #1731 (comment) ) @ tnummy ( https://github.com/tnummy ) Thanks for this, it fixed the KLAP auth failures on two Kasa devices (an HS103 and a KP115) that had been stuck in "Authentication expired" for days. Both reauthenticated successfully after installing the patch and I can confirm the fallback is working as described. One minor thing worth flagging: on startup I saw this in the logs, repeated 3 times then stopped: Detected blocking call to listdir with args ('/config/deps/lib/python3.14/site-packages',) inside the event loop by custom integration 'kasa_klap_fix' at custom_components/ kasa_klap_fix/ patch. py ( http://custom_components/kasa_klap_fix/patch.py ) , line 38 Not a functional problem since it only fired at startup and everything worked fine after, but might be worth wrapping that listdir call in hass.async_add_executor_job() to keep it off the event loop and clear the warning. Appreciate you putting this together, saved me from waiting on the upstream python-kasa fix. — Reply to this email directly, view it on GitHub ( #1731?email_source=notifications&email_token=AAHOEHEHRAIO6RFVXBC5MAD5QQFCXA5CNFSNUABFM5UWIORPF5TWS5BNNB2WEL2JONZXKZKDN5WW2ZLOOQXTKOBQGAYDONRSGY22M4TFMFZW63VHMNXW23LFNZ2KKZLWMVXHJLDGN5XXIZLSL5RWY2LDNM#issuecomment-5800076265 ) , or unsubscribe ( https://github.com/notifications/unsubscribe-auth/AAHOEHBJJDJEY6WICF6J6JT5QQFCXAVCNFSNUABFKJSXA33TNF2G64TZHMZDEMJVG4YTMMJRHNEXG43VMU5TIOJXHA4TCMBWGQ42C5QC ). You are receiving this because you commented. Message ID: <python-kasa/python-kasa/pull/1731/c5800076265 @ github. com>
tnummy reacted with heart emoji
All reactions
  • ❤️ 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@cstankaitis

cstankaitis commented Sep 29, 2026

Copy link
Copy Markdown

I applied this patch (looking forward to it being merged in a proper update) and this fixed all my switch's auth issues. Thank you!

tnummy reacted with heart emoji
All reactions
  • ❤️ 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@tnummy

tnummy commented Sep 30, 2026

Copy link
Copy Markdown

@tnummy Thanks for this, it fixed the KLAP auth failures on two Kasa devices (an HS103 and a KP115) that had been stuck in "Authentication expired" for days. Both reauthenticated successfully after installing the patch and I can confirm the fallback is working as described.

One minor thing worth flagging: on startup I saw this in the logs, repeated 3 times then stopped:

Detected blocking call to listdir with args ('/config/deps/lib/python3.14/site-packages',) inside the event loop by custom integration 'kasa_klap_fix' at custom_components/kasa_klap_fix/patch.py, line 38

Not a functional problem since it only fired at startup and everything worked fine after, but might be worth wrapping that listdir call in hass.async_add_executor_job() to keep it off the event loop and clear the warning.

Appreciate you putting this together, saved me from waiting on the upstream python-kasa fix.

Thanks for noticing that - it should be fixed now (v1.0.1)

fzs122 reacted with thumbs up emoji
All reactions
  • 👍 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

@rytilahti

rytilahti commented Sep 30, 2026

Copy link
Copy Markdown
Member

Thanks a lot for the PR, @bm1549, and everyone who tested and reported here, your help and feedback is really appreciated!

Let's merge this to get it into the next python-kasa release, I'm planning to release this weekend, alas, too late for the next homeassistant release.

bm1549 and DoctorDelusional reacted with hooray emoji bm1549 reacted with rocket emoji
All reactions
  • 🎉 2 reactions
  • 🚀 1 reaction

Sorry, something went wrong.

Uh oh!

There was an error while loading. Please reload this page.

rytilahti
rytilahti approved these changes Sep 30, 2026
View reviewed changes
@rytilahti
rytilahti merged commit 998ebe7 into python-kasa:master Sep 30, 2026
22 checks passed

Uh oh!

There was an error while loading. Please reload this page.

@bm1549
bm1549 deleted the fix/iot-klap-login-v2 branch September 30, 2026 18:49
@rytilahti rytilahti added the bug Something isn't working label Oct 4, 2026
@rytilahti rytilahti mentioned this pull request Oct 4, 2026
Prepare 0.11.0 #1776
Merged
rytilahti added a commit that referenced this pull request Oct 4, 2026
@rytilahti
Prepare 0.11.0 (#1776)
5b8447c
## [0.11.0](https://github.com/python-kasa/python-kasa/tree/0.11.0)
(2026-10-04)

[Full
Changelog](0.10.2...0.11.0)

**Release summary:**

This is a huge and long overdue release, coming more than a year and a
half after the previous one.
Hopefully the next one follows sooner, as the TPAP transport (which did
not make it into this release) is used more and more on newer devices.

This release brings broader camera support, new modules for lights,
vacuums and cameras, and many connectivity fixes for newer firmware
versions. Some other highlights:
- Improved Tapo camera support: login version 3, presets, wifi handling,
last alert detection, and more robust authentication and discovery.
- Selective room cleaning for robot vacuums.
- Configurable light strip length via the new strip segment module, and
an exposed light transition state change flag.
- Basic HomeKit module for Kasa (iot) devices.
- Energy monitoring V2 support (S515D).
- Better hub and thermostat state reporting (hold, summer mode, low
battery).
- Connection fixes for newer Tapo firmware and older SSL devices, plus
KLAP v2 for iot devices.
- More resilient time handling, with failover and UTC fallback for iot
devices.
- Python 3.14 is now supported.
- Inclusion of fixtures for 29 devices or firmware versions, including
the Tapo C460, C200 and C101 cameras and the KH100 hub with KE100/KE110
thermostats.

**Thank you to all contributors!**

A big thank you to everyone who contributed to this release, whether
through code, device fixtures, bug reports or testing.

Special thanks to @ZeliardM for a huge effort on both features and
project maintenance, including but not limited to:
- Features like the HomeKit module for iot devices, iot time module
failover, wifi handling and credential improvements for cameras, Tapo
login version 3, and V2 energy monitoring for S515D.
- A lot of necessary maintenance work including type annotations and
cleanups throughout the test suite, modernized docstrings, CI hardening
with SHA-pinned actions, and many bug fixes. This helps us to keep the
library maintainable and open to new contributions.

A warm welcome to our new contributors, with special thanks to those who
contributed improvements and fixes:
- @alams154: discovery on port 20004
- @bluntman001: iot device classification fix
- @bm1549: KLAP v2 transport for iot devices
- @darylldelfin: cipher support for newer Tapo firmware
- @davidefiocco: vacuum mop water level fix
- @epg-pers: selective room cleaning for vacuums
- @freeKC: camera discovery and authentication fixes
- @gpongelli: extended camera detection
- @Ikstar: KL420 color temperature range
- @juherr: last alert detection module for cameras, camera error codes
and a C200 fixture
- @kad: SSL connections to older devices
- @KaloyanNaumov: multi-request timeout handling
- @loganrosen: KL400L5 color temperature range
- @markvanpraet: Tapo C460 support and camera battery fix
- @monteccarlos: iot timezone mapping fix
- @mrwogu: preset support for Tapo cameras
- @nopoz: strip segment module, light transition flag and credentials
hash fix
- @tk1475: UTC fallback for unset iot device clocks
- @wh1t3f1r3: non-retryable network error handling

Thanks also to our new contributors who provided device fixtures to help
future development efforts: @emanueleg, @fantandrea, @HarryPehkonen,
@ijaron, @Krotu, @LostLuma, @mjbohr and @TheLinuxGuy.

**This release in numbers:**

- 68 merged pull requests from 29 contributors, 27 of them first-time
contributors
- 8 new modules
- 29 new device fixtures
- 203 files changed, with 25,199 lines added and 2,585 removed


**Implemented enhancements:**

- \[Feature Request\] C220 camera line crossing detection on-off switch
[\#1551](#1551)
- SslAesTransport: handshake again when a camera answers 401 to
passthrough
[\#1771](#1771) (@freeKC)
- Add LastAlertDetection module for smartcam devices
[\#1762](#1762) (@juherr)
- Add KL420 to TPLINK\_KELVIN color temperature ranges
[\#1757](#1757) (@Ikstar)
- Do not authenticate with a credentials\_hash from a different
transport [\#1749](#1749)
(@nopoz)
- Expose the light transition state change flag
[\#1745](#1745) (@nopoz)
- Add strip segment module for configurable light strip length
[\#1744](#1744) (@nopoz)
- Add KL400L5 color temperature range
[\#1719](#1719)
(@loganrosen)
- Update smartcam credential handling and tests
[\#1664](#1664)
(@ZeliardM)
- Add support for V2 Energy Monitoring for S515D
[\#1663](#1663)
(@ZeliardM)
- Add selective room cleaning to vacuum clean module
[\#1660](#1660)
(@epg-pers)
- New Wi-Fi handling for SMARTCAM devices
[\#1639](#1639)
(@ZeliardM)
- Add support for tapo login\_version 3 in sslaestransport
[\#1638](#1638)
(@ZeliardM)
- Add preset support for Tapo cameras
[\#1615](#1615) (@mrwogu)
- Add python 3.14 to supported versions
[\#1599](#1599)
(@rytilahti)
- Add discovery port 20004
[\#1595](#1595)
(@alams154)
- Implement IOT Time Module Failover
[\#1583](#1583)
(@ZeliardM)
- Add bare bones homekit module for iot devices
[\#1566](#1566)
(@ZeliardM)
- Extend smartcam detection support
[\#1552](#1552)
(@gpongelli)

**Fixed bugs:**

- Time module unavailable for waterleak sensor
[\#1613](#1613)
- 'No time zone found with key EST' in debian 13
[\#1579](#1579)
- Discovery: accept cameras that only send the encrypt\_type list
[\#1770](#1770) (@freeKC)
- Classify IOT devices via sysinfo regardless of transport \(fixes
\#1740\) [\#1769](#1769)
(@bluntman001)
- Fall back to UTC for iot time when the device clock is not set
[\#1768](#1768) (@tk1475)
- Add UNKNOWN\_USERNAME \(-60502\) camera error code
[\#1761](#1761) (@juherr)
- Disable multi requests on timeout during multi-request
[\#1759](#1759)
(@KaloyanNaumov)
- Add ECDHE-RSA-AES256 cipher for newer Tapo firmware
[\#1755](#1755)
(@darylldelfin)
- Map iot timezone index 18 to America/New\_York instead of EST
[\#1743](#1743)
(@monteccarlos)
- fix: use KLAP v2 transport for IOT devices with login version 2
[\#1731](#1731) (@bm1549)
- Add ENETUNREACH to non-retryable errors in XorTransport
[\#1668](#1668)
(@wh1t3f1r3)
- Fix mop set\_waterlevel sending setCleanAttr without type field
[\#1667](#1667)
(@davidefiocco)
- Fix SMARTCAM Time module and update tests
[\#1659](#1659)
(@ZeliardM)
- Fix camera login version in CLI
[\#1658](#1658)
(@ZeliardM)
- Allow SSL connections to older devices
[\#1654](#1654) (@kad)
- waterleaksensor: use parent's Time for alert timestamp
[\#1614](#1614)
(@rytilahti)
- Add hold state to thermostatstate
[\#1609](#1609)
(@rytilahti)
- Fix thermostat idle reporting on low battery
[\#1598](#1598)
(@rytilahti)
- Add shutdown \(summer mode\) to thermostatstate
[\#1588](#1588)
(@rytilahti)
- Fix iotstrip child device time handling
[\#1584](#1584)
(@ZeliardM)

**Added support for devices:**

- Add C200 device fixture
[\#1760](#1760) (@juherr)
- Add P125M fixture for firmware 1.4.4
[\#1746](#1746)
(@HarryPehkonen)
- Add fixtures for KH100, KE100 and KE110 and simulate TRV states
[\#1726](#1726) (@Krotu)
- Add L530EA\(EU\) device fixture
[\#1694](#1694)
(@ZeliardM)
- Add C101 test fixture
[\#1673](#1673) (@ijaron)
- Add LB130\(US\) device fixture
[\#1669](#1669)
(@ZeliardM)
- Add KL110B\(UN\) device fixture
[\#1657](#1657)
(@ZeliardM)
- Add TS15\(US\) device fixture
[\#1649](#1649)
(@ZeliardM)
- Add Tapo C460 support
[\#1645](#1645)
(@markvanpraet)
- Add P105\(US\) device fixture
[\#1644](#1644)
(@ZeliardM)
- Add L430C\(EU\) device fixture
[\#1643](#1643)
(@ZeliardM)
- Add L430P\(EU\) device fixture
[\#1607](#1607)
(@LostLuma)
- Add S500\(US\)\_1.0\_1.2.0 fixture
[\#1569](#1569)
(@ZeliardM)
- Add device fixture for P316M\(US\)
[\#1568](#1568)
(@TheLinuxGuy)
- Add L535E\(EU\) 3.0 1.1.8 fixture
[\#1545](#1545)
(@fantandrea)
- Adding KL400L10\(US\)\_1.0\_1.0.10 fixture
[\#1539](#1539) (@mjbohr)
- Add TP10\(IT\) 1.0 1.2.5 fixture
[\#1538](#1538)
(@emanueleg)
- Add LB100\(US\)\_1.0\_1.8.11 fixture file
[\#1515](#1515)
(@ZeliardM)
- Add KS225\(US\)\_1.0\_1.1.1 and L930-5\(EU\)\_1.0\_1.2.5
[\#1509](#1509)
(@ZeliardM)

**Documentation updates:**

- How to hash credentials to make use of --credentials-hash flag?
[\#1517](#1517)
- docs: modernize docstrings across the repository
[\#1682](#1682)
(@ZeliardM)
- Add a note to emeter guide being kasa-only
[\#1512](#1512)
(@rytilahti)

**Project maintenance:**

- tests: add type annotations to top-level test files
[\#1688](#1688)
(@ZeliardM)
- tests: add type annotations to CLI, protocol, and smartcam tests
[\#1687](#1687)
(@ZeliardM)
- tests: add type annotations to Smart tests
[\#1686](#1686)
(@ZeliardM)
- tests: add type annotations to IoT tests
[\#1685](#1685)
(@ZeliardM)
- tests: add type annotations to transport tests
[\#1684](#1684)
(@ZeliardM)
- tests: centralize transport and session cleanup in conftest
[\#1683](#1683)
(@ZeliardM)
- ci: pin all GitHub Actions to SHA hashes and update versions
[\#1681](#1681)
(@ZeliardM)
- tests: fix typos, child device subtype, CLI patch path, and
deprecation test logic
[\#1677](#1677)
(@ZeliardM)
- Update GitHub Workflows and Actions
[\#1622](#1622)
(@ZeliardM)
- Use log-level debug for smartdevice query error reporting
[\#1587](#1587)
(@rytilahti)
- Use Device instead of SmartDevice where feasible
[\#1585](#1585)
(@ZeliardM)

**Closed issues:**

- Python 3.14 Support
[\#1597](#1597)
- HS300 Child State - Time Module Error
[\#1445](#1445)
@rytilahti rytilahti mentioned this pull request Oct 4, 2026
Prepare 0.11.0.1 #1780
Merged
rytilahti added a commit that referenced this pull request Oct 4, 2026
@rytilahti
Prepare 0.11.0.1 (#1780)
ff26187
## [0.11.0.1](https://github.com/python-kasa/python-kasa/tree/0.11.0.1)
(2026-10-04)

[Full
Changelog](0.10.2...0.11.0.1)

**Release summary:**

*Note: 0.11.0 was tagged but never published to PyPI due to a packaging
issue. 0.11.0.1 contains the same changes plus a fix for the release
workflow.*

This is a huge and long overdue release, coming more than a year and a
half after the previous one.
Hopefully the next one follows sooner, as the TPAP transport (which did
not make it into this release) is used more and more on newer devices.

This release brings broader camera support, new modules for lights,
vacuums and cameras, and many connectivity fixes for newer firmware
versions. Some other highlights:
- Improved Tapo camera support: login version 3, presets, wifi handling,
last alert detection, and more robust authentication and discovery.
- Selective room cleaning for robot vacuums.
- Configurable light strip length via the new strip segment module, and
an exposed light transition state change flag.
- Basic HomeKit module for Kasa (iot) devices.
- Energy monitoring V2 support (S515D).
- Better hub and thermostat state reporting (hold, summer mode, low
battery).
- Connection fixes for newer Tapo firmware and older SSL devices, plus
KLAP v2 for iot devices.
- More resilient time handling, with failover and UTC fallback for iot
devices.
- Python 3.14 is now supported.
- Inclusion of fixtures for 29 devices or firmware versions, including
the Tapo C460, C200 and C101 cameras and the KH100 hub with KE100/KE110
thermostats.

**Thank you to all contributors!**

A big thank you to everyone who contributed to this release, whether
through code, device fixtures, bug reports or testing.

Special thanks to @ZeliardM for a huge effort on both features and
project maintenance, including but not limited to:
- Features like the HomeKit module for iot devices, iot time module
failover, wifi handling and credential improvements for cameras, Tapo
login version 3, and V2 energy monitoring for S515D.
- A lot of necessary maintenance work including type annotations and
cleanups throughout the test suite, modernized docstrings, CI hardening
with SHA-pinned actions, and many bug fixes. This helps us to keep the
library maintainable and open to new contributions.

A warm welcome to our new contributors, with special thanks to those who
contributed improvements and fixes:
- @alams154: discovery on port 20004
- @bluntman001: iot device classification fix
- @bm1549: KLAP v2 transport for iot devices
- @darylldelfin: cipher support for newer Tapo firmware
- @davidefiocco: vacuum mop water level fix
- @epg-pers: selective room cleaning for vacuums
- @freeKC: camera discovery and authentication fixes
- @gpongelli: extended camera detection
- @Ikstar: KL420 color temperature range
- @juherr: last alert detection module for cameras, camera error codes
and a C200 fixture
- @kad: SSL connections to older devices
- @KaloyanNaumov: multi-request timeout handling
- @loganrosen: KL400L5 color temperature range
- @markvanpraet: Tapo C460 support and camera battery fix
- @monteccarlos: iot timezone mapping fix
- @mrwogu: preset support for Tapo cameras
- @nopoz: strip segment module, light transition flag and credentials
hash fix
- @tk1475: UTC fallback for unset iot device clocks
- @wh1t3f1r3: non-retryable network error handling

Thanks also to our new contributors who provided device fixtures to help
future development efforts: @emanueleg, @fantandrea, @HarryPehkonen,
@ijaron, @Krotu, @LostLuma, @mjbohr and @TheLinuxGuy.

**This release in numbers:**

- 68 merged pull requests from 29 contributors, 27 of them first-time
contributors
- 8 new modules
- 29 new device fixtures
- 203 files changed, with 25,199 lines added and 2,585 removed


**Implemented enhancements:**

- \[Feature Request\] C220 camera line crossing detection on-off switch
[\#1551](#1551)
- SslAesTransport: handshake again when a camera answers 401 to
passthrough
[\#1771](#1771) (@freeKC)
- Add LastAlertDetection module for smartcam devices
[\#1762](#1762) (@juherr)
- Add KL420 to TPLINK\_KELVIN color temperature ranges
[\#1757](#1757) (@Ikstar)
- Do not authenticate with a credentials\_hash from a different
transport [\#1749](#1749)
(@nopoz)
- Expose the light transition state change flag
[\#1745](#1745) (@nopoz)
- Add strip segment module for configurable light strip length
[\#1744](#1744) (@nopoz)
- Add KL400L5 color temperature range
[\#1719](#1719)
(@loganrosen)
- Update smartcam credential handling and tests
[\#1664](#1664)
(@ZeliardM)
- Add support for V2 Energy Monitoring for S515D
[\#1663](#1663)
(@ZeliardM)
- Add selective room cleaning to vacuum clean module
[\#1660](#1660)
(@epg-pers)
- New Wi-Fi handling for SMARTCAM devices
[\#1639](#1639)
(@ZeliardM)
- Add support for tapo login\_version 3 in sslaestransport
[\#1638](#1638)
(@ZeliardM)
- Add preset support for Tapo cameras
[\#1615](#1615) (@mrwogu)
- Add python 3.14 to supported versions
[\#1599](#1599)
(@rytilahti)
- Add discovery port 20004
[\#1595](#1595)
(@alams154)
- Implement IOT Time Module Failover
[\#1583](#1583)
(@ZeliardM)
- Add bare bones homekit module for iot devices
[\#1566](#1566)
(@ZeliardM)
- Extend smartcam detection support
[\#1552](#1552)
(@gpongelli)

**Fixed bugs:**

- Time module unavailable for waterleak sensor
[\#1613](#1613)
- 'No time zone found with key EST' in debian 13
[\#1579](#1579)
- Discovery: accept cameras that only send the encrypt\_type list
[\#1770](#1770) (@freeKC)
- Classify IOT devices via sysinfo regardless of transport \(fixes
\#1740\) [\#1769](#1769)
(@bluntman001)
- Fall back to UTC for iot time when the device clock is not set
[\#1768](#1768) (@tk1475)
- Add UNKNOWN\_USERNAME \(-60502\) camera error code
[\#1761](#1761) (@juherr)
- Disable multi requests on timeout during multi-request
[\#1759](#1759)
(@KaloyanNaumov)
- Add ECDHE-RSA-AES256 cipher for newer Tapo firmware
[\#1755](#1755)
(@darylldelfin)
- Map iot timezone index 18 to America/New\_York instead of EST
[\#1743](#1743)
(@monteccarlos)
- fix: use KLAP v2 transport for IOT devices with login version 2
[\#1731](#1731) (@bm1549)
- Add ENETUNREACH to non-retryable errors in XorTransport
[\#1668](#1668)
(@wh1t3f1r3)
- Fix mop set\_waterlevel sending setCleanAttr without type field
[\#1667](#1667)
(@davidefiocco)
- Fix SMARTCAM Time module and update tests
[\#1659](#1659)
(@ZeliardM)
- Fix camera login version in CLI
[\#1658](#1658)
(@ZeliardM)
- Allow SSL connections to older devices
[\#1654](#1654) (@kad)
- waterleaksensor: use parent's Time for alert timestamp
[\#1614](#1614)
(@rytilahti)
- Add hold state to thermostatstate
[\#1609](#1609)
(@rytilahti)
- Fix thermostat idle reporting on low battery
[\#1598](#1598)
(@rytilahti)
- Add shutdown \(summer mode\) to thermostatstate
[\#1588](#1588)
(@rytilahti)
- Fix iotstrip child device time handling
[\#1584](#1584)
(@ZeliardM)

**Added support for devices:**

- Add C200 device fixture
[\#1760](#1760) (@juherr)
- Add P125M fixture for firmware 1.4.4
[\#1746](#1746)
(@HarryPehkonen)
- Add fixtures for KH100, KE100 and KE110 and simulate TRV states
[\#1726](#1726) (@Krotu)
- Add L530EA\(EU\) device fixture
[\#1694](#1694)
(@ZeliardM)
- Add C101 test fixture
[\#1673](#1673) (@ijaron)
- Add LB130\(US\) device fixture
[\#1669](#1669)
(@ZeliardM)
- Add KL110B\(UN\) device fixture
[\#1657](#1657)
(@ZeliardM)
- Add TS15\(US\) device fixture
[\#1649](#1649)
(@ZeliardM)
- Add Tapo C460 support
[\#1645](#1645)
(@markvanpraet)
- Add P105\(US\) device fixture
[\#1644](#1644)
(@ZeliardM)
- Add L430C\(EU\) device fixture
[\#1643](#1643)
(@ZeliardM)
- Add L430P\(EU\) device fixture
[\#1607](#1607)
(@LostLuma)
- Add S500\(US\)\_1.0\_1.2.0 fixture
[\#1569](#1569)
(@ZeliardM)
- Add device fixture for P316M\(US\)
[\#1568](#1568)
(@TheLinuxGuy)
- Add L535E\(EU\) 3.0 1.1.8 fixture
[\#1545](#1545)
(@fantandrea)
- Adding KL400L10\(US\)\_1.0\_1.0.10 fixture
[\#1539](#1539) (@mjbohr)
- Add TP10\(IT\) 1.0 1.2.5 fixture
[\#1538](#1538)
(@emanueleg)
- Add LB100\(US\)\_1.0\_1.8.11 fixture file
[\#1515](#1515)
(@ZeliardM)
- Add KS225\(US\)\_1.0\_1.1.1 and L930-5\(EU\)\_1.0\_1.2.5
[\#1509](#1509)
(@ZeliardM)

**Documentation updates:**

- How to hash credentials to make use of --credentials-hash flag?
[\#1517](#1517)
- docs: modernize docstrings across the repository
[\#1682](#1682)
(@ZeliardM)
- Add a note to emeter guide being kasa-only
[\#1512](#1512)
(@rytilahti)

**Project maintenance:**

- Fix PyPI publishing for packages with metadata 2.5
[\#1779](#1779)
(@rytilahti)
- tests: add type annotations to top-level test files
[\#1688](#1688)
(@ZeliardM)
- tests: add type annotations to CLI, protocol, and smartcam tests
[\#1687](#1687)
(@ZeliardM)
- tests: add type annotations to Smart tests
[\#1686](#1686)
(@ZeliardM)
- tests: add type annotations to IoT tests
[\#1685](#1685)
(@ZeliardM)
- tests: add type annotations to transport tests
[\#1684](#1684)
(@ZeliardM)
- tests: centralize transport and session cleanup in conftest
[\#1683](#1683)
(@ZeliardM)
- ci: pin all GitHub Actions to SHA hashes and update versions
[\#1681](#1681)
(@ZeliardM)
- tests: fix typos, child device subtype, CLI patch path, and
deprecation test logic
[\#1677](#1677)
(@ZeliardM)
- Update GitHub Workflows and Actions
[\#1622](#1622)
(@ZeliardM)
- Use log-level debug for smartdevice query error reporting
[\#1587](#1587)
(@rytilahti)
- Use Device instead of SmartDevice where feasible
[\#1585](#1585)
(@ZeliardM)

**Closed issues:**

- Python 3.14 Support
[\#1597](#1597)
- HS300 Child State - Time Module Error
[\#1445](#1445)
pillarsdotnet pushed a commit to pillarsdotnet/python-kasa that referenced this pull request Oct 22, 2026
@bm1549 @claude
fix: use KLAP v2 transport for IOT devices with login version 2 (pyth…
e7e5eac
…on-kasa#1731)

Some IOT-family devices keep the legacy IOT command set after a firmware
update but upgrade their KLAP authentication to login version 2 (sha256 hashing).

This change selects `KlapTransportV2` for `IOT.KLAP` devices that advertise
`login_version >= 2`, matching the transport already used for `SMART.KLAP`.
Devices with login version 1 (or unset) are unchanged and continue to use the v1 `KlapTransport`.

Co-authored-by: Claude Opus 4.8 <[email protected]>
@ZeliardM ZeliardM mentioned this pull request Oct 29, 2026
Refactor discovery and connection routing #1725
Closed
pillarsdotnet pushed a commit to pillarsdotnet/python-kasa that referenced this pull request Oct 30, 2026
@rytilahti
Prepare 0.11.0 (python-kasa#1776)
1189d3e
## [0.11.0](https://github.com/python-kasa/python-kasa/tree/0.11.0)
(2026-10-04)

[Full
Changelog](python-kasa/python-kasa@0.10.2...0.11.0)

**Release summary:**

This is a huge and long overdue release, coming more than a year and a
half after the previous one.
Hopefully the next one follows sooner, as the TPAP transport (which did
not make it into this release) is used more and more on newer devices.

This release brings broader camera support, new modules for lights,
vacuums and cameras, and many connectivity fixes for newer firmware
versions. Some other highlights:
- Improved Tapo camera support: login version 3, presets, wifi handling,
last alert detection, and more robust authentication and discovery.
- Selective room cleaning for robot vacuums.
- Configurable light strip length via the new strip segment module, and
an exposed light transition state change flag.
- Basic HomeKit module for Kasa (iot) devices.
- Energy monitoring V2 support (S515D).
- Better hub and thermostat state reporting (hold, summer mode, low
battery).
- Connection fixes for newer Tapo firmware and older SSL devices, plus
KLAP v2 for iot devices.
- More resilient time handling, with failover and UTC fallback for iot
devices.
- Python 3.14 is now supported.
- Inclusion of fixtures for 29 devices or firmware versions, including
the Tapo C460, C200 and C101 cameras and the KH100 hub with KE100/KE110
thermostats.

**Thank you to all contributors!**

A big thank you to everyone who contributed to this release, whether
through code, device fixtures, bug reports or testing.

Special thanks to @ZeliardM for a huge effort on both features and
project maintenance, including but not limited to:
- Features like the HomeKit module for iot devices, iot time module
failover, wifi handling and credential improvements for cameras, Tapo
login version 3, and V2 energy monitoring for S515D.
- A lot of necessary maintenance work including type annotations and
cleanups throughout the test suite, modernized docstrings, CI hardening
with SHA-pinned actions, and many bug fixes. This helps us to keep the
library maintainable and open to new contributions.

A warm welcome to our new contributors, with special thanks to those who
contributed improvements and fixes:
- @alams154: discovery on port 20004
- @bluntman001: iot device classification fix
- @bm1549: KLAP v2 transport for iot devices
- @darylldelfin: cipher support for newer Tapo firmware
- @davidefiocco: vacuum mop water level fix
- @epg-pers: selective room cleaning for vacuums
- @freeKC: camera discovery and authentication fixes
- @gpongelli: extended camera detection
- @Ikstar: KL420 color temperature range
- @juherr: last alert detection module for cameras, camera error codes
and a C200 fixture
- @kad: SSL connections to older devices
- @KaloyanNaumov: multi-request timeout handling
- @loganrosen: KL400L5 color temperature range
- @markvanpraet: Tapo C460 support and camera battery fix
- @monteccarlos: iot timezone mapping fix
- @mrwogu: preset support for Tapo cameras
- @nopoz: strip segment module, light transition flag and credentials
hash fix
- @tk1475: UTC fallback for unset iot device clocks
- @wh1t3f1r3: non-retryable network error handling

Thanks also to our new contributors who provided device fixtures to help
future development efforts: @emanueleg, @fantandrea, @HarryPehkonen,
@ijaron, @Krotu, @LostLuma, @mjbohr and @TheLinuxGuy.

**This release in numbers:**

- 68 merged pull requests from 29 contributors, 27 of them first-time
contributors
- 8 new modules
- 29 new device fixtures
- 203 files changed, with 25,199 lines added and 2,585 removed


**Implemented enhancements:**

- \[Feature Request\] C220 camera line crossing detection on-off switch
[\python-kasa#1551](python-kasa#1551)
- SslAesTransport: handshake again when a camera answers 401 to
passthrough
[\python-kasa#1771](python-kasa#1771) (@freeKC)
- Add LastAlertDetection module for smartcam devices
[\python-kasa#1762](python-kasa#1762) (@juherr)
- Add KL420 to TPLINK\_KELVIN color temperature ranges
[\python-kasa#1757](python-kasa#1757) (@Ikstar)
- Do not authenticate with a credentials\_hash from a different
transport [\python-kasa#1749](python-kasa#1749)
(@nopoz)
- Expose the light transition state change flag
[\python-kasa#1745](python-kasa#1745) (@nopoz)
- Add strip segment module for configurable light strip length
[\python-kasa#1744](python-kasa#1744) (@nopoz)
- Add KL400L5 color temperature range
[\python-kasa#1719](python-kasa#1719)
(@loganrosen)
- Update smartcam credential handling and tests
[\python-kasa#1664](python-kasa#1664)
(@ZeliardM)
- Add support for V2 Energy Monitoring for S515D
[\python-kasa#1663](python-kasa#1663)
(@ZeliardM)
- Add selective room cleaning to vacuum clean module
[\python-kasa#1660](python-kasa#1660)
(@epg-pers)
- New Wi-Fi handling for SMARTCAM devices
[\python-kasa#1639](python-kasa#1639)
(@ZeliardM)
- Add support for tapo login\_version 3 in sslaestransport
[\python-kasa#1638](python-kasa#1638)
(@ZeliardM)
- Add preset support for Tapo cameras
[\python-kasa#1615](python-kasa#1615) (@mrwogu)
- Add python 3.14 to supported versions
[\python-kasa#1599](python-kasa#1599)
(@rytilahti)
- Add discovery port 20004
[\python-kasa#1595](python-kasa#1595)
(@alams154)
- Implement IOT Time Module Failover
[\python-kasa#1583](python-kasa#1583)
(@ZeliardM)
- Add bare bones homekit module for iot devices
[\python-kasa#1566](python-kasa#1566)
(@ZeliardM)
- Extend smartcam detection support
[\python-kasa#1552](python-kasa#1552)
(@gpongelli)

**Fixed bugs:**

- Time module unavailable for waterleak sensor
[\python-kasa#1613](python-kasa#1613)
- 'No time zone found with key EST' in debian 13
[\python-kasa#1579](python-kasa#1579)
- Discovery: accept cameras that only send the encrypt\_type list
[\python-kasa#1770](python-kasa#1770) (@freeKC)
- Classify IOT devices via sysinfo regardless of transport \(fixes
\python-kasa#1740\) [\python-kasa#1769](python-kasa#1769)
(@bluntman001)
- Fall back to UTC for iot time when the device clock is not set
[\python-kasa#1768](python-kasa#1768) (@tk1475)
- Add UNKNOWN\_USERNAME \(-60502\) camera error code
[\python-kasa#1761](python-kasa#1761) (@juherr)
- Disable multi requests on timeout during multi-request
[\python-kasa#1759](python-kasa#1759)
(@KaloyanNaumov)
- Add ECDHE-RSA-AES256 cipher for newer Tapo firmware
[\python-kasa#1755](python-kasa#1755)
(@darylldelfin)
- Map iot timezone index 18 to America/New\_York instead of EST
[\python-kasa#1743](python-kasa#1743)
(@monteccarlos)
- fix: use KLAP v2 transport for IOT devices with login version 2
[\python-kasa#1731](python-kasa#1731) (@bm1549)
- Add ENETUNREACH to non-retryable errors in XorTransport
[\python-kasa#1668](python-kasa#1668)
(@wh1t3f1r3)
- Fix mop set\_waterlevel sending setCleanAttr without type field
[\python-kasa#1667](python-kasa#1667)
(@davidefiocco)
- Fix SMARTCAM Time module and update tests
[\python-kasa#1659](python-kasa#1659)
(@ZeliardM)
- Fix camera login version in CLI
[\python-kasa#1658](python-kasa#1658)
(@ZeliardM)
- Allow SSL connections to older devices
[\python-kasa#1654](python-kasa#1654) (@kad)
- waterleaksensor: use parent's Time for alert timestamp
[\python-kasa#1614](python-kasa#1614)
(@rytilahti)
- Add hold state to thermostatstate
[\python-kasa#1609](python-kasa#1609)
(@rytilahti)
- Fix thermostat idle reporting on low battery
[\python-kasa#1598](python-kasa#1598)
(@rytilahti)
- Add shutdown \(summer mode\) to thermostatstate
[\python-kasa#1588](python-kasa#1588)
(@rytilahti)
- Fix iotstrip child device time handling
[\python-kasa#1584](python-kasa#1584)
(@ZeliardM)

**Added support for devices:**

- Add C200 device fixture
[\python-kasa#1760](python-kasa#1760) (@juherr)
- Add P125M fixture for firmware 1.4.4
[\python-kasa#1746](python-kasa#1746)
(@HarryPehkonen)
- Add fixtures for KH100, KE100 and KE110 and simulate TRV states
[\python-kasa#1726](python-kasa#1726) (@Krotu)
- Add L530EA\(EU\) device fixture
[\python-kasa#1694](python-kasa#1694)
(@ZeliardM)
- Add C101 test fixture
[\python-kasa#1673](python-kasa#1673) (@ijaron)
- Add LB130\(US\) device fixture
[\python-kasa#1669](python-kasa#1669)
(@ZeliardM)
- Add KL110B\(UN\) device fixture
[\python-kasa#1657](python-kasa#1657)
(@ZeliardM)
- Add TS15\(US\) device fixture
[\python-kasa#1649](python-kasa#1649)
(@ZeliardM)
- Add Tapo C460 support
[\python-kasa#1645](python-kasa#1645)
(@markvanpraet)
- Add P105\(US\) device fixture
[\python-kasa#1644](python-kasa#1644)
(@ZeliardM)
- Add L430C\(EU\) device fixture
[\python-kasa#1643](python-kasa#1643)
(@ZeliardM)
- Add L430P\(EU\) device fixture
[\python-kasa#1607](python-kasa#1607)
(@LostLuma)
- Add S500\(US\)\_1.0\_1.2.0 fixture
[\python-kasa#1569](python-kasa#1569)
(@ZeliardM)
- Add device fixture for P316M\(US\)
[\python-kasa#1568](python-kasa#1568)
(@TheLinuxGuy)
- Add L535E\(EU\) 3.0 1.1.8 fixture
[\python-kasa#1545](python-kasa#1545)
(@fantandrea)
- Adding KL400L10\(US\)\_1.0\_1.0.10 fixture
[\python-kasa#1539](python-kasa#1539) (@mjbohr)
- Add TP10\(IT\) 1.0 1.2.5 fixture
[\python-kasa#1538](python-kasa#1538)
(@emanueleg)
- Add LB100\(US\)\_1.0\_1.8.11 fixture file
[\python-kasa#1515](python-kasa#1515)
(@ZeliardM)
- Add KS225\(US\)\_1.0\_1.1.1 and L930-5\(EU\)\_1.0\_1.2.5
[\python-kasa#1509](python-kasa#1509)
(@ZeliardM)

**Documentation updates:**

- How to hash credentials to make use of --credentials-hash flag?
[\python-kasa#1517](python-kasa#1517)
- docs: modernize docstrings across the repository
[\python-kasa#1682](python-kasa#1682)
(@ZeliardM)
- Add a note to emeter guide being kasa-only
[\python-kasa#1512](python-kasa#1512)
(@rytilahti)

**Project maintenance:**

- tests: add type annotations to top-level test files
[\python-kasa#1688](python-kasa#1688)
(@ZeliardM)
- tests: add type annotations to CLI, protocol, and smartcam tests
[\python-kasa#1687](python-kasa#1687)
(@ZeliardM)
- tests: add type annotations to Smart tests
[\python-kasa#1686](python-kasa#1686)
(@ZeliardM)
- tests: add type annotations to IoT tests
[\python-kasa#1685](python-kasa#1685)
(@ZeliardM)
- tests: add type annotations to transport tests
[\python-kasa#1684](python-kasa#1684)
(@ZeliardM)
- tests: centralize transport and session cleanup in conftest
[\python-kasa#1683](python-kasa#1683)
(@ZeliardM)
- ci: pin all GitHub Actions to SHA hashes and update versions
[\python-kasa#1681](python-kasa#1681)
(@ZeliardM)
- tests: fix typos, child device subtype, CLI patch path, and
deprecation test logic
[\python-kasa#1677](python-kasa#1677)
(@ZeliardM)
- Update GitHub Workflows and Actions
[\python-kasa#1622](python-kasa#1622)
(@ZeliardM)
- Use log-level debug for smartdevice query error reporting
[\python-kasa#1587](python-kasa#1587)
(@rytilahti)
- Use Device instead of SmartDevice where feasible
[\python-kasa#1585](python-kasa#1585)
(@ZeliardM)

**Closed issues:**

- Python 3.14 Support
[\python-kasa#1597](python-kasa#1597)
- HS300 Child State - Time Module Error
[\python-kasa#1445](python-kasa#1445)
pillarsdotnet pushed a commit to pillarsdotnet/python-kasa that referenced this pull request Oct 30, 2026
@rytilahti
Prepare 0.11.0.1 (python-kasa#1780)
577b3f7
## [0.11.0.1](https://github.com/python-kasa/python-kasa/tree/0.11.0.1)
(2026-10-04)

[Full
Changelog](python-kasa/python-kasa@0.10.2...0.11.0.1)

**Release summary:**

*Note: 0.11.0 was tagged but never published to PyPI due to a packaging
issue. 0.11.0.1 contains the same changes plus a fix for the release
workflow.*

This is a huge and long overdue release, coming more than a year and a
half after the previous one.
Hopefully the next one follows sooner, as the TPAP transport (which did
not make it into this release) is used more and more on newer devices.

This release brings broader camera support, new modules for lights,
vacuums and cameras, and many connectivity fixes for newer firmware
versions. Some other highlights:
- Improved Tapo camera support: login version 3, presets, wifi handling,
last alert detection, and more robust authentication and discovery.
- Selective room cleaning for robot vacuums.
- Configurable light strip length via the new strip segment module, and
an exposed light transition state change flag.
- Basic HomeKit module for Kasa (iot) devices.
- Energy monitoring V2 support (S515D).
- Better hub and thermostat state reporting (hold, summer mode, low
battery).
- Connection fixes for newer Tapo firmware and older SSL devices, plus
KLAP v2 for iot devices.
- More resilient time handling, with failover and UTC fallback for iot
devices.
- Python 3.14 is now supported.
- Inclusion of fixtures for 29 devices or firmware versions, including
the Tapo C460, C200 and C101 cameras and the KH100 hub with KE100/KE110
thermostats.

**Thank you to all contributors!**

A big thank you to everyone who contributed to this release, whether
through code, device fixtures, bug reports or testing.

Special thanks to @ZeliardM for a huge effort on both features and
project maintenance, including but not limited to:
- Features like the HomeKit module for iot devices, iot time module
failover, wifi handling and credential improvements for cameras, Tapo
login version 3, and V2 energy monitoring for S515D.
- A lot of necessary maintenance work including type annotations and
cleanups throughout the test suite, modernized docstrings, CI hardening
with SHA-pinned actions, and many bug fixes. This helps us to keep the
library maintainable and open to new contributions.

A warm welcome to our new contributors, with special thanks to those who
contributed improvements and fixes:
- @alams154: discovery on port 20004
- @bluntman001: iot device classification fix
- @bm1549: KLAP v2 transport for iot devices
- @darylldelfin: cipher support for newer Tapo firmware
- @davidefiocco: vacuum mop water level fix
- @epg-pers: selective room cleaning for vacuums
- @freeKC: camera discovery and authentication fixes
- @gpongelli: extended camera detection
- @Ikstar: KL420 color temperature range
- @juherr: last alert detection module for cameras, camera error codes
and a C200 fixture
- @kad: SSL connections to older devices
- @KaloyanNaumov: multi-request timeout handling
- @loganrosen: KL400L5 color temperature range
- @markvanpraet: Tapo C460 support and camera battery fix
- @monteccarlos: iot timezone mapping fix
- @mrwogu: preset support for Tapo cameras
- @nopoz: strip segment module, light transition flag and credentials
hash fix
- @tk1475: UTC fallback for unset iot device clocks
- @wh1t3f1r3: non-retryable network error handling

Thanks also to our new contributors who provided device fixtures to help
future development efforts: @emanueleg, @fantandrea, @HarryPehkonen,
@ijaron, @Krotu, @LostLuma, @mjbohr and @TheLinuxGuy.

**This release in numbers:**

- 68 merged pull requests from 29 contributors, 27 of them first-time
contributors
- 8 new modules
- 29 new device fixtures
- 203 files changed, with 25,199 lines added and 2,585 removed


**Implemented enhancements:**

- \[Feature Request\] C220 camera line crossing detection on-off switch
[\python-kasa#1551](python-kasa#1551)
- SslAesTransport: handshake again when a camera answers 401 to
passthrough
[\python-kasa#1771](python-kasa#1771) (@freeKC)
- Add LastAlertDetection module for smartcam devices
[\python-kasa#1762](python-kasa#1762) (@juherr)
- Add KL420 to TPLINK\_KELVIN color temperature ranges
[\python-kasa#1757](python-kasa#1757) (@Ikstar)
- Do not authenticate with a credentials\_hash from a different
transport [\python-kasa#1749](python-kasa#1749)
(@nopoz)
- Expose the light transition state change flag
[\python-kasa#1745](python-kasa#1745) (@nopoz)
- Add strip segment module for configurable light strip length
[\python-kasa#1744](python-kasa#1744) (@nopoz)
- Add KL400L5 color temperature range
[\python-kasa#1719](python-kasa#1719)
(@loganrosen)
- Update smartcam credential handling and tests
[\python-kasa#1664](python-kasa#1664)
(@ZeliardM)
- Add support for V2 Energy Monitoring for S515D
[\python-kasa#1663](python-kasa#1663)
(@ZeliardM)
- Add selective room cleaning to vacuum clean module
[\python-kasa#1660](python-kasa#1660)
(@epg-pers)
- New Wi-Fi handling for SMARTCAM devices
[\python-kasa#1639](python-kasa#1639)
(@ZeliardM)
- Add support for tapo login\_version 3 in sslaestransport
[\python-kasa#1638](python-kasa#1638)
(@ZeliardM)
- Add preset support for Tapo cameras
[\python-kasa#1615](python-kasa#1615) (@mrwogu)
- Add python 3.14 to supported versions
[\python-kasa#1599](python-kasa#1599)
(@rytilahti)
- Add discovery port 20004
[\python-kasa#1595](python-kasa#1595)
(@alams154)
- Implement IOT Time Module Failover
[\python-kasa#1583](python-kasa#1583)
(@ZeliardM)
- Add bare bones homekit module for iot devices
[\python-kasa#1566](python-kasa#1566)
(@ZeliardM)
- Extend smartcam detection support
[\python-kasa#1552](python-kasa#1552)
(@gpongelli)

**Fixed bugs:**

- Time module unavailable for waterleak sensor
[\python-kasa#1613](python-kasa#1613)
- 'No time zone found with key EST' in debian 13
[\python-kasa#1579](python-kasa#1579)
- Discovery: accept cameras that only send the encrypt\_type list
[\python-kasa#1770](python-kasa#1770) (@freeKC)
- Classify IOT devices via sysinfo regardless of transport \(fixes
\python-kasa#1740\) [\python-kasa#1769](python-kasa#1769)
(@bluntman001)
- Fall back to UTC for iot time when the device clock is not set
[\python-kasa#1768](python-kasa#1768) (@tk1475)
- Add UNKNOWN\_USERNAME \(-60502\) camera error code
[\python-kasa#1761](python-kasa#1761) (@juherr)
- Disable multi requests on timeout during multi-request
[\python-kasa#1759](python-kasa#1759)
(@KaloyanNaumov)
- Add ECDHE-RSA-AES256 cipher for newer Tapo firmware
[\python-kasa#1755](python-kasa#1755)
(@darylldelfin)
- Map iot timezone index 18 to America/New\_York instead of EST
[\python-kasa#1743](python-kasa#1743)
(@monteccarlos)
- fix: use KLAP v2 transport for IOT devices with login version 2
[\python-kasa#1731](python-kasa#1731) (@bm1549)
- Add ENETUNREACH to non-retryable errors in XorTransport
[\python-kasa#1668](python-kasa#1668)
(@wh1t3f1r3)
- Fix mop set\_waterlevel sending setCleanAttr without type field
[\python-kasa#1667](python-kasa#1667)
(@davidefiocco)
- Fix SMARTCAM Time module and update tests
[\python-kasa#1659](python-kasa#1659)
(@ZeliardM)
- Fix camera login version in CLI
[\python-kasa#1658](python-kasa#1658)
(@ZeliardM)
- Allow SSL connections to older devices
[\python-kasa#1654](python-kasa#1654) (@kad)
- waterleaksensor: use parent's Time for alert timestamp
[\python-kasa#1614](python-kasa#1614)
(@rytilahti)
- Add hold state to thermostatstate
[\python-kasa#1609](python-kasa#1609)
(@rytilahti)
- Fix thermostat idle reporting on low battery
[\python-kasa#1598](python-kasa#1598)
(@rytilahti)
- Add shutdown \(summer mode\) to thermostatstate
[\python-kasa#1588](python-kasa#1588)
(@rytilahti)
- Fix iotstrip child device time handling
[\python-kasa#1584](python-kasa#1584)
(@ZeliardM)

**Added support for devices:**

- Add C200 device fixture
[\python-kasa#1760](python-kasa#1760) (@juherr)
- Add P125M fixture for firmware 1.4.4
[\python-kasa#1746](python-kasa#1746)
(@HarryPehkonen)
- Add fixtures for KH100, KE100 and KE110 and simulate TRV states
[\python-kasa#1726](python-kasa#1726) (@Krotu)
- Add L530EA\(EU\) device fixture
[\python-kasa#1694](python-kasa#1694)
(@ZeliardM)
- Add C101 test fixture
[\python-kasa#1673](python-kasa#1673) (@ijaron)
- Add LB130\(US\) device fixture
[\python-kasa#1669](python-kasa#1669)
(@ZeliardM)
- Add KL110B\(UN\) device fixture
[\python-kasa#1657](python-kasa#1657)
(@ZeliardM)
- Add TS15\(US\) device fixture
[\python-kasa#1649](python-kasa#1649)
(@ZeliardM)
- Add Tapo C460 support
[\python-kasa#1645](python-kasa#1645)
(@markvanpraet)
- Add P105\(US\) device fixture
[\python-kasa#1644](python-kasa#1644)
(@ZeliardM)
- Add L430C\(EU\) device fixture
[\python-kasa#1643](python-kasa#1643)
(@ZeliardM)
- Add L430P\(EU\) device fixture
[\python-kasa#1607](python-kasa#1607)
(@LostLuma)
- Add S500\(US\)\_1.0\_1.2.0 fixture
[\python-kasa#1569](python-kasa#1569)
(@ZeliardM)
- Add device fixture for P316M\(US\)
[\python-kasa#1568](python-kasa#1568)
(@TheLinuxGuy)
- Add L535E\(EU\) 3.0 1.1.8 fixture
[\python-kasa#1545](python-kasa#1545)
(@fantandrea)
- Adding KL400L10\(US\)\_1.0\_1.0.10 fixture
[\python-kasa#1539](python-kasa#1539) (@mjbohr)
- Add TP10\(IT\) 1.0 1.2.5 fixture
[\python-kasa#1538](python-kasa#1538)
(@emanueleg)
- Add LB100\(US\)\_1.0\_1.8.11 fixture file
[\python-kasa#1515](python-kasa#1515)
(@ZeliardM)
- Add KS225\(US\)\_1.0\_1.1.1 and L930-5\(EU\)\_1.0\_1.2.5
[\python-kasa#1509](python-kasa#1509)
(@ZeliardM)

**Documentation updates:**

- How to hash credentials to make use of --credentials-hash flag?
[\python-kasa#1517](python-kasa#1517)
- docs: modernize docstrings across the repository
[\python-kasa#1682](python-kasa#1682)
(@ZeliardM)
- Add a note to emeter guide being kasa-only
[\python-kasa#1512](python-kasa#1512)
(@rytilahti)

**Project maintenance:**

- Fix PyPI publishing for packages with metadata 2.5
[\python-kasa#1779](python-kasa#1779)
(@rytilahti)
- tests: add type annotations to top-level test files
[\python-kasa#1688](python-kasa#1688)
(@ZeliardM)
- tests: add type annotations to CLI, protocol, and smartcam tests
[\python-kasa#1687](python-kasa#1687)
(@ZeliardM)
- tests: add type annotations to Smart tests
[\python-kasa#1686](python-kasa#1686)
(@ZeliardM)
- tests: add type annotations to IoT tests
[\python-kasa#1685](python-kasa#1685)
(@ZeliardM)
- tests: add type annotations to transport tests
[\python-kasa#1684](python-kasa#1684)
(@ZeliardM)
- tests: centralize transport and session cleanup in conftest
[\python-kasa#1683](python-kasa#1683)
(@ZeliardM)
- ci: pin all GitHub Actions to SHA hashes and update versions
[\python-kasa#1681](python-kasa#1681)
(@ZeliardM)
- tests: fix typos, child device subtype, CLI patch path, and
deprecation test logic
[\python-kasa#1677](python-kasa#1677)
(@ZeliardM)
- Update GitHub Workflows and Actions
[\python-kasa#1622](python-kasa#1622)
(@ZeliardM)
- Use log-level debug for smartdevice query error reporting
[\python-kasa#1587](python-kasa#1587)
(@rytilahti)
- Use Device instead of SmartDevice where feasible
[\python-kasa#1585](python-kasa#1585)
(@ZeliardM)

**Closed issues:**

- Python 3.14 Support
[\python-kasa#1597](python-kasa#1597)
- HS300 Child State - Time Module Error
[\python-kasa#1445](python-kasa#1445)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Reviewers

@rytilahti rytilahti rytilahti approved these changes

Uh oh!

There was an error while loading. Please reload this page.

Assignees

No one assigned

Labels

bug Something isn't working

Projects

None yet

Milestone

No milestone

Development

Successfully merging this pull request may close these issues.

TP-Link HS300 fails authentication with "Device response did not match our challenge" after 2026.7.4 update — resolved by rolling back to 2026.7.3

Uh oh!

There was an error while loading. Please reload this page.

13 participants

@bm1549 @emmjaibi @iamteedoh @ophirr @Als-Pal @davebco @daharoni @adam8833 @tnummy @dyllan-p @fzs122 @cstankaitis @rytilahti
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
You are visitor 01402503 — GeezerVison does not store the pages you look up.
Best viewed with Netscape Navigator 4.7 or Internet Explorer 6 at 800×600. No cookies required.