2024-06-03 09:14:10 +00:00
# python-kasa
2017-03-25 22:04:32 +00:00
2019-12-18 08:11:18 +00:00
[![PyPI version ](https://badge.fury.io/py/python-kasa.svg )](https://badge.fury.io/py/python-kasa)
2021-09-23 16:25:41 +00:00
[![Build Status ](https://github.com/python-kasa/python-kasa/actions/workflows/ci.yml/badge.svg )](https://github.com/python-kasa/python-kasa/actions/workflows/ci.yml)
[![codecov ](https://codecov.io/gh/python-kasa/python-kasa/branch/master/graph/badge.svg?token=5K7rtN5OmS )](https://codecov.io/gh/python-kasa/python-kasa)
2020-07-12 21:28:20 +00:00
[![Documentation Status ](https://readthedocs.org/projects/python-kasa/badge/?version=latest )](https://python-kasa.readthedocs.io/en/latest/?badge=latest)
2017-10-07 15:51:10 +00:00
2023-12-06 21:54:14 +00:00
python-kasa is a Python library to control TPLink's smart home devices (plugs, wall switches, power strips, and bulbs).
2023-02-18 21:40:42 +00:00
This is a voluntary, community-driven effort and is not affiliated, sponsored, or endorsed by TPLink.
2023-12-06 21:54:14 +00:00
**Contributions in any form (adding missing features, reporting issues, fixing or triaging existing ones, improving the documentation, or device donations) are more than welcome!**
2023-02-18 21:40:42 +00:00
---
2020-05-12 10:11:47 +00:00
2020-07-12 20:46:21 +00:00
## Getting started
2017-10-07 15:51:10 +00:00
Release 0.4.0 (#221)
This is the first proper python-kasa release since forking from pyhs100.
* Improved I/O handling, including asyncio interface, request merging & connection sharing
* API improvements throughout the whole package
* Support for LED strips
* Improved bulb support (transitions, support for more models)
* Onboarding is now possible without a mobile app
* Improved documentation
* And various other improvements, see the full changelog for details!
Thanks to all contributors, from testers, and issue reporters to those who have submitted pull requests! Thanks also to those who donated test devices to help to make this release happen!
Special thanks for this release go to @basnijholt (initial asyncio port, push to make this fork happen) and @bdraco (fixing the last release blocker, emeter support for powerstrips).
If you are using python-kasa in your projects, we would be happy to hear about it. Feel free to post a note on Github discussions!
If it is a project that could be interesting for other users and/or developers, feel also free to create a PR to add a short note to the README file.
2021-09-27 17:10:05 +00:00
You can install the most recent release using pip:
2020-07-12 20:46:21 +00:00
```
Release 0.4.0 (#221)
This is the first proper python-kasa release since forking from pyhs100.
* Improved I/O handling, including asyncio interface, request merging & connection sharing
* API improvements throughout the whole package
* Support for LED strips
* Improved bulb support (transitions, support for more models)
* Onboarding is now possible without a mobile app
* Improved documentation
* And various other improvements, see the full changelog for details!
Thanks to all contributors, from testers, and issue reporters to those who have submitted pull requests! Thanks also to those who donated test devices to help to make this release happen!
Special thanks for this release go to @basnijholt (initial asyncio port, push to make this fork happen) and @bdraco (fixing the last release blocker, emeter support for powerstrips).
If you are using python-kasa in your projects, we would be happy to hear about it. Feel free to post a note on Github discussions!
If it is a project that could be interesting for other users and/or developers, feel also free to create a PR to add a short note to the README file.
2021-09-27 17:10:05 +00:00
pip install python-kasa
2020-07-12 20:46:21 +00:00
```
2020-05-12 10:11:47 +00:00
2024-09-06 14:48:43 +00:00
Alternatively, you can clone this repository and use `uv` to install the development version:
2020-07-12 20:46:21 +00:00
```
git clone https://github.com/python-kasa/python-kasa.git
cd python-kasa/
2024-09-06 14:48:43 +00:00
uv sync --all-extras
uv run kasa
2020-07-12 20:46:21 +00:00
```
Read all data from the device, disable double-encoding, implement more APIs, refactor querying, update README (#11)
* Read from socket until no data available, disable double string encoding
HS110 sends sometimes datagrams in chunks especially for get_daystat,
this patch makes it to read until there is no more data to be read.
As json.dumps() does JSON encoding already, there's no need to str()
the year or month either.
* Add cli.py, a simple script to query devices for debugging purposes.
* allow easier importing with from pyHS100 import SmartPlug
* move cli.py to examples, add short usage into README.md
* Implement more available APIs, refactor querying code.
This commit adds access to new properties, both read & write, while keeping the old one (mostly) intact.
Querying is refactored to be done inside _query_helper() method,
which unwraps results automatically and rises SmartPlugException() in case of errors.
Errors are to be handled by clients.
New features:
* Setting device alias (plug.alias = "name")
* led read & write
* icon read (doesn't seem to return anything without cloud support at least), write API is not known, throws an exception currently
* time read (returns datetime), time write implemented, but not working even when no error is returned from the device
* timezone read
* mac read & write, writing is untested for now.
Properties for easier access:
* hw_info: return hw-specific elements from sysinfo
* on_since: pretty-printed from sysinfo
* location: latitude and longitued from sysinfo
* rssi: rssi from sysinfo
* Update README.md with examples of available features.
* Handle comments from mweinelt
* Refactor state handling, use booleans instead of strings
* Fix issues raised during the review.
Following issues are addressed by this commit:
* All API is more or less commented (including return types, exceptions, ..)
* Converted state to use
* Added properties is_on, is_off for those who don't want to check against strings.
* Handled most issues reported by pylint.
* Adjusted _query_helper() to strip off err_code from the result object.
* Fixed broken format() syntax for string formattings.
* Fix ci woes plus one typo.
* Do initialization after changing device properties, fix nits.
2016-12-12 09:13:45 +00:00
2023-12-06 21:54:14 +00:00
If you have not yet provisioned your device, [you can do so using the cli tool ](https://python-kasa.readthedocs.io/en/latest/cli.html#provisioning ).
2017-10-07 15:51:10 +00:00
## Discovering devices
2017-03-25 22:04:32 +00:00
2023-12-06 21:54:14 +00:00
Running `kasa discover` will send discovery packets to the default broadcast address (`255.255.255.255`) to discover supported devices.
2024-06-21 18:37:46 +00:00
If your device requires authentication to control it,
you need to pass the credentials using `--username` and `--password` options or define `KASA_USERNAME` and `KASA_PASSWORD` environment variables.
> [!NOTE]
> If your system has multiple network interfaces, you can specify the broadcast address using the `--target` option.
2023-12-06 21:54:14 +00:00
The `discover` command will automatically execute the `state` command on all the discovered devices:
```
$ kasa discover
Discovering devices on 255.255.255.255 for 3 seconds
2024-06-21 18:37:46 +00:00
== Bulb McBulby - L530 ==
2024-06-22 14:29:06 +00:00
Host: 192.0.2.123
Port: 80
Device state: False
Time: 2024-06-22 15:42:15+02:00 (tz: {'timezone': 'CEST'}
Hardware: 3.0
Software: 1.1.6 Build 240130 Rel.173828
MAC (rssi): 5C:E9:31:aa:bb:cc (-50)
== Primary features ==
State (state): False
Brightness (brightness): 11 (range: 0-100)
Color temperature (color_temperature): 0 (range: 2500-6500)
Light effect (light_effect): *Off* Party Relax
== Information ==
Signal Level (signal_level): 2
Overheated (overheated): False
Cloud connection (cloud_connection): False
Update available (update_available): None
Device time (device_time): 2024-06-22 15:42:15+02:00
== Configuration ==
HSV (hsv): HSV(hue=35, saturation=70, value=11)
Auto update enabled (auto_update_enabled): False
Light preset (light_preset): *Not set* Light preset 1 Light preset 2 Light preset 3 Light preset 4 Light preset 5 Light preset 6 Light preset 7
Smooth transition on (smooth_transition_on): 2 (range: 0-60)
Smooth transition off (smooth_transition_off): 20 (range: 0-60)
== Debug ==
Device ID (device_id): soneuniqueidentifier
RSSI (rssi): -50 dBm
SSID (ssid): HomeNet
Current firmware version (current_firmware_version): 1.1.6 Build 240130 Rel.173828
Available firmware version (available_firmware_version): None
2017-03-25 22:04:32 +00:00
```
2020-07-12 20:46:21 +00:00
2024-06-21 18:37:46 +00:00
## Command line usage
2017-10-07 15:51:10 +00:00
2024-06-21 18:37:46 +00:00
All devices support a variety of common commands (like `on` , `off` , and `state` ).
The syntax to control device is `kasa --host <host> <command>` :
2023-12-06 21:54:14 +00:00
2024-06-21 18:37:46 +00:00
```
$ kasa --host 192.0.2.123 on
```
2023-12-06 21:54:14 +00:00
Use `kasa --help` ([or consult the documentation](https://python-kasa.readthedocs.io/en/latest/cli.html#kasa-help)) to get a list of all available commands and options.
2024-06-22 14:29:06 +00:00
Some examples of available options include JSON output (`--json`), more verbose output (`--verbose`), and defining timeouts (`--timeout` and `--discovery-timeout` ).
2024-06-21 18:37:46 +00:00
Refer [the documentation ](https://python-kasa.readthedocs.io/en/latest/cli.html ) for more details.
2023-12-06 21:54:14 +00:00
2024-06-21 18:37:46 +00:00
> [!NOTE]
> Each individual command may also have additional options, which are shown when called with the `--help` option.
2023-12-06 21:54:14 +00:00
2024-06-21 18:37:46 +00:00
### Feature interface
2023-12-06 21:54:14 +00:00
2024-06-21 18:37:46 +00:00
All devices are also controllable through a generic feature-based interface.
2024-06-22 14:29:06 +00:00
The available features differ from device to device and are accessible using `kasa feature` command:
2023-12-06 21:54:14 +00:00
```
2024-06-21 18:37:46 +00:00
$ kasa --host 192.0.2.123 feature
2024-06-22 14:29:06 +00:00
== Primary features ==
2024-06-21 18:37:46 +00:00
State (state): False
Brightness (brightness): 11 (range: 0-100)
2024-06-22 14:29:06 +00:00
Color temperature (color_temperature): 0 (range: 2500-6500)
Light effect (light_effect): *Off* Party Relax
== Information ==
Signal Level (signal_level): 2
Overheated (overheated): False
2024-06-21 18:37:46 +00:00
Cloud connection (cloud_connection): False
2024-06-22 14:29:06 +00:00
Update available (update_available): None
Device time (device_time): 2024-06-22 15:39:44+02:00
== Configuration ==
2024-06-21 18:37:46 +00:00
HSV (hsv): HSV(hue=35, saturation=70, value=11)
Auto update enabled (auto_update_enabled): False
Light preset (light_preset): *Not set* Light preset 1 Light preset 2 Light preset 3 Light preset 4 Light preset 5 Light preset 6 Light preset 7
Smooth transition on (smooth_transition_on): 2 (range: 0-60)
Smooth transition off (smooth_transition_off): 20 (range: 0-60)
2024-06-22 14:29:06 +00:00
== Debug ==
Device ID (device_id): soneuniqueidentifier
RSSI (rssi): -50 dBm
SSID (ssid): HomeNet
Current firmware version (current_firmware_version): 1.1.6 Build 240130 Rel.173828
Available firmware version (available_firmware_version): None
2024-06-21 18:37:46 +00:00
```
2023-12-06 21:54:14 +00:00
2024-06-22 14:29:06 +00:00
Some features present configuration that can be changed:
2023-12-06 21:54:14 +00:00
```
2024-06-21 18:37:46 +00:00
kasa --host 192.0.2.123 feature color_temperature 2500
Changing color_temperature from 0 to 2500
New state: 2500
2023-12-06 21:54:14 +00:00
```
2024-06-21 18:37:46 +00:00
> [!NOTE]
> When controlling hub-connected devices, you need to pass the device ID of the connected device as an option: `kasa --host 192.0.2.200 feature --child someuniqueidentifier target_temperature 21`
2023-12-06 21:54:14 +00:00
2024-06-21 18:37:46 +00:00
## Library usage
2023-12-06 21:54:14 +00:00
```
2024-06-21 18:37:46 +00:00
import asyncio
from kasa import Discover
2017-10-07 15:51:10 +00:00
2024-06-21 18:37:46 +00:00
async def main():
dev = await Discover.discover_single("192.0.2.123", username="un@example.com", password="pw")
await dev.turn_on()
await dev.update()
2017-10-07 15:51:10 +00:00
2024-06-21 18:37:46 +00:00
if __name__ == "__main__":
asyncio.run(main())
2017-10-07 15:51:10 +00:00
```
2024-05-16 16:13:44 +00:00
If you want to use this library in your own project, a good starting point is [the tutorial in the documentation ](https://python-kasa.readthedocs.io/en/latest/tutorial.html ).
2024-06-19 08:53:40 +00:00
You can find several code examples in the API documentation [How to guides ](https://python-kasa.readthedocs.io/en/latest/guides.html ).
2017-10-07 15:51:10 +00:00
2024-06-19 08:53:40 +00:00
Information about the library design and the way the devices work can be found in the [topics section ](https://python-kasa.readthedocs.io/en/latest/topics.html ).
2017-10-13 21:27:05 +00:00
2020-05-12 10:11:47 +00:00
## Contributing
2017-10-13 21:27:05 +00:00
2024-05-08 13:25:22 +00:00
Contributions are very welcome! The easiest way to contribute is by [creating a fixture file ](https://python-kasa.readthedocs.io/en/latest/contribute.html#contributing-fixture-files ) for the automated test suite if your device hardware and firmware version is not currently listed as supported.
Please refer to [our contributing guidelines ](https://python-kasa.readthedocs.io/en/latest/contribute.html ).
2020-07-12 20:46:21 +00:00
## Supported devices
2024-05-08 13:25:22 +00:00
The following devices have been tested and confirmed as working. If your device is unlisted but working, please consider [contributing a fixture file ](https://python-kasa.readthedocs.io/en/latest/contribute.html#contributing-fixture-files ).
2020-07-12 20:46:21 +00:00
2024-10-29 08:58:47 +00:00
> [!NOTE]
> The hub attached Tapo buttons S200B and S200D do not currently support alerting when the button is pressed.
2024-12-16 12:19:25 +00:00
> [!NOTE]
> Some firmware versions of Tapo Cameras will not authenticate unless you enable "Tapo Lab" > "Third-Party Compatibility" in the native Tapo app.
> Alternatively, you can factory reset and then prevent the device from accessing the internet.
2024-03-01 18:32:45 +00:00
<!-- Do not edit text inside the SUPPORTED section below -->
<!-- SUPPORTED_START -->
### Supported Kasa devices
2024-01-29 17:14:30 +00:00
2024-11-25 17:02:12 +00:00
- **Plugs**: EP10, EP25[^1], HS100[^2], HS103, HS105, HS110, KP100, KP105, KP115, KP125, KP125M[^1], KP401
- **Power Strips**: EP40, EP40M[^1], HS107, HS300, KP200, KP303, KP400
2024-12-10 06:14:17 +00:00
- **Wall Switches**: ES20M, HS200[^2], HS210, HS220[^2], KP405, KS200, KS200M, KS205[^1], KS220, KS220M, KS225[^1], KS230, KS240[^1]
2024-04-20 15:37:24 +00:00
- **Bulbs**: KL110, KL120, KL125, KL130, KL135, KL50, KL60, LB110
2024-03-01 18:32:45 +00:00
- **Light Strips**: KL400L5, KL420L5, KL430
2024-11-25 17:02:12 +00:00
- **Hubs**: KH100[^1]
- **Hub-Connected Devices[^3]**: KE100[^1]
2023-12-08 13:55:14 +00:00
2024-11-25 17:02:12 +00:00
### Supported Tapo[^1] devices
2023-12-08 13:55:14 +00:00
2024-11-23 12:30:39 +00:00
- **Plugs**: P100, P110, P110M, P115, P125M, P135, TP15
2024-12-21 09:36:57 +00:00
- **Power Strips**: P210M, P300, P304M, P306, TP25
2024-06-03 16:52:15 +00:00
- **Wall Switches**: S500D, S505, S505D
2024-11-10 13:56:14 +00:00
- **Bulbs**: L510B, L510E, L530E, L630
2024-03-01 18:32:45 +00:00
- **Light Strips**: L900-10, L900-5, L920-5, L930-5
2024-12-21 09:17:50 +00:00
- **Cameras**: C100, C210, C225, C325WB, C520WS, TC65, TC70
2024-11-14 18:28:30 +00:00
- **Hubs**: H100, H200
2024-11-25 17:02:12 +00:00
- **Hub-Connected Devices[^3]**: S200B, S200D, T100, T110, T300, T310, T315
2024-01-23 10:14:59 +00:00
2024-03-01 18:32:45 +00:00
<!-- SUPPORTED_END -->
2024-11-25 17:02:12 +00:00
[^1]: Model requires authentication
[^2]: Newer versions require authentication
[^3]: Devices may work across TAPO/KASA branded hubs
2023-12-06 21:54:14 +00:00
2024-03-01 18:32:45 +00:00
See [supported devices in our documentation ](SUPPORTED.md ) for more detailed information about tested hardware and software versions.
2020-07-12 21:07:24 +00:00
2021-02-07 21:25:42 +00:00
## Resources
2023-11-07 01:15:57 +00:00
### Developer Resources
2020-07-12 21:07:24 +00:00
2024-11-13 17:42:45 +00:00
* [softScheck's github contains lot of information and wireshark dissector ](https://github.com/softScheck/tplink-smartplug )
2021-02-07 21:25:42 +00:00
* [TP-Link Smart Home Device Simulator ](https://github.com/plasticrake/tplink-smarthome-simulator )
2022-06-27 15:26:45 +00:00
* [Unofficial API documentation ](https://github.com/plasticrake/tplink-smarthome-api )
2023-11-07 01:15:57 +00:00
* [Another unofficial API documentation ](https://github.com/whitslack/kasa )
* [pyHS100 ](https://github.com/GadgetReactor/pyHS100 ) provides synchronous interface and is the unmaintained predecessor of this library.
### Library Users
* [Home Assistant ](https://www.home-assistant.io/integrations/tplink/ )
2021-02-18 22:24:53 +00:00
* [MQTT access to TP-Link devices, using python-kasa ](https://github.com/flavio-fernandes/mqtt2kasa )
2024-12-12 09:51:45 +00:00
* [Homebridge Kasa Python Plug-In ](https://github.com/ZeliardM/homebridge-kasa-python )
2021-02-07 21:25:42 +00:00
2024-06-22 14:29:06 +00:00
### Other related projects
2023-12-08 13:55:14 +00:00
2023-11-07 01:15:57 +00:00
* [PyTapo - Python library for communication with Tapo Cameras ](https://github.com/JurajNyiri/pytapo )
2024-12-02 15:38:20 +00:00
* [Home Assistant integration ](https://github.com/JurajNyiri/HomeAssistant-Tapo-Control )
2024-01-24 08:36:45 +00:00
* [Tapo P100 (Tapo plugs, Tapo bulbs) ](https://github.com/fishbigger/TapoP100 )
2021-02-07 21:25:42 +00:00
* [Home Assistant integration ](https://github.com/fishbigger/HomeAssistant-Tapo-P100-Control )
2023-11-07 01:15:57 +00:00
* [plugp100, another tapo library ](https://github.com/petretiandrea/plugp100 )
* [Home Assistant integration ](https://github.com/petretiandrea/home-assistant-tapo-p100 )
2024-06-22 14:29:06 +00:00
* [rust and python implementation for tapo devices ](https://github.com/mihai-dinculescu/tapo/ )