2023-02-18 21:40:42 +00:00
< h2 align = "center" > python-kasa< / h2 >
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-02-20 18:40:28 +00:00
For enhanced cli tool support (coloring, embedded shell) install with `[shell]` :
```
pip install python-kasa[shell]
```
2023-06-17 23:03:04 +00:00
If you are using cpython, it is recommended to install with `[speedups]` to enable orjson (faster json support):
```
pip install python-kasa[speedups]
```
2024-02-20 18:40:28 +00:00
or for both:
```
pip install python-kasa[speedups, shell]
```
2023-07-01 23:03:50 +00:00
With `[speedups]` , the protocol overhead is roughly an order of magnitude lower (benchmarks available in devtools).
2020-07-12 20:46:21 +00:00
Alternatively, you can clone this repository and use poetry to install the development version:
```
git clone https://github.com/python-kasa/python-kasa.git
cd python-kasa/
poetry install
```
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.
If your system has multiple network interfaces, you can specify the broadcast address using the `--target` option.
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
== Bulb McBulby - KL130(EU) ==
Host: 192.168.xx.xx
Port: 9999
Device state: True
== Generic information ==
Time: 2023-12-05 14:33:23 (tz: {'index': 6, 'err_code': 0}
Hardware: 1.0
Software: 1.8.8 Build 190613 Rel.123436
MAC (rssi): 1c:3b:f3:xx:xx:xx (-56)
Location: {'latitude': None, 'longitude': None}
== Device specific information ==
Brightness: 16
Is dimmable: True
Color temperature: 2500
Valid temperature range: ColorTempRange(min=2500, max=9000)
HSV: HSV(hue=0, saturation=0, value=16)
Presets:
index=0 brightness=50 hue=0 saturation=0 color_temp=2500 custom=None id=None mode=None
index=1 brightness=100 hue=299 saturation=95 color_temp=0 custom=None id=None mode=None
index=2 brightness=100 hue=120 saturation=75 color_temp=0 custom=None id=None mode=None
index=3 brightness=100 hue=240 saturation=75 color_temp=0 custom=None id=None mode=None
== Current State ==
< EmeterStatus power = 2.4 voltage = None current = None total = None >
== Modules ==
+ < Module Schedule ( smartlife . iot . common . schedule ) for 192 . 168 . xx . xx >
+ < Module Usage ( smartlife . iot . common . schedule ) for 192 . 168 . xx . xx >
+ < Module Antitheft ( smartlife . iot . common . anti_theft ) for 192 . 168 . xx . xx >
+ < Module Time ( smartlife . iot . common . timesetting ) for 192 . 168 . xx . xx >
+ < Module Emeter ( smartlife . iot . common . emeter ) for 192 . 168 . xx . xx >
- < Module Countdown ( countdown ) for 192 . 168 . xx . xx >
+ < Module Cloud ( smartlife . iot . common . cloud ) for 192 . 168 . xx . xx >
2017-03-25 22:04:32 +00:00
```
2023-12-06 21:54:14 +00:00
If your device requires authentication to control it,
you need to pass the credentials using `--username` and `--password` options.
2020-07-12 20:46:21 +00:00
2023-12-06 21:54:14 +00:00
## Basic functionalities
2017-10-07 15:51:10 +00:00
All devices support a variety of common commands, including:
2023-12-06 21:54:14 +00:00
* `state` which returns state information
* `on` and `off` for turning the device on or off
* `emeter` (where applicable) to return energy consumption information
* `sysinfo` to return raw system information
The syntax to control device is `kasa --host <ip address> <command>` .
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.
Some examples of available options include JSON output (`--json`), defining timeouts (`--timeout` and `--discovery-timeout` ).
Each individual command may also have additional options, which are shown when called with the `--help` option.
For example, `--transition` on bulbs requests a smooth state change, while `--name` and `--index` are used on power strips to select the socket to act on:
```
$ kasa on --help
Usage: kasa on [OPTIONS]
Turn the device on.
Options:
--index INTEGER
--name TEXT
--transition INTEGER
--help Show this message and exit.
```
### Bulbs
Common commands for bulbs and light strips include:
* `brightness` to control the brightness
* `hsv` to control the colors
* `temperature` to control the color temperatures
When executed without parameters, these commands will report the current state.
Some devices support `--transition` option to perform a smooth state change.
For example, the following turns the light to 30% brightness over a period of five seconds:
```
$ kasa --host < addr > brightness --transition 5000 30
```
See `--help` for additional options and [the documentation ](https://python-kasa.readthedocs.io/en/latest/smartbulb.html ) for more details about supported features and limitations.
### Power strips
Each individual socket can be controlled separately by passing `--index` or `--name` to the command.
If neither option is defined, the commands act on the whole power strip.
For example:
```
$ kasa --host < addr > off # turns off all sockets
$ kasa --host < addr > off --name 'Socket1' # turns off socket named 'Socket1'
```
See `--help` for additional options and [the documentation ](https://python-kasa.readthedocs.io/en/latest/smartstrip.html ) for more details about supported features and limitations.
2017-10-07 15:51:10 +00:00
## Energy meter
2023-12-06 21:54:14 +00:00
Running `kasa emeter` command will return the current consumption.
2017-10-07 15:51:10 +00:00
Possible options include `--year` and `--month` for retrieving historical state,
2023-12-06 21:54:14 +00:00
and reseting the counters can be done with `--erase` .
2017-10-07 15:51:10 +00:00
```
2019-12-18 08:11:18 +00:00
$ kasa emeter
2017-10-07 15:51:10 +00:00
== Emeter ==
Current state: {'total': 133.105, 'power': 108.223577, 'current': 0.54463, 'voltage': 225.296283}
```
2023-12-06 21:54:14 +00:00
# Library usage
2017-10-07 15:51:10 +00:00
2023-12-06 21:54:14 +00:00
If you want to use this library in your own project, a good starting point is to check [the documentation on discovering devices ](https://python-kasa.readthedocs.io/en/latest/discover.html ).
You can find several code examples in the API documentation of each of the implementation base classes, check out the [documentation for the base class shared by all supported devices ](https://python-kasa.readthedocs.io/en/latest/smartdevice.html ).
2017-10-07 15:51:10 +00:00
2023-12-06 21:54:14 +00:00
[The library design and module structure is described in a separate page ](https://python-kasa.readthedocs.io/en/latest/design.html ).
2017-03-25 22:04:32 +00:00
2023-12-06 21:54:14 +00:00
The device type specific documentation can be found in their separate pages:
* [Plugs ](https://python-kasa.readthedocs.io/en/latest/smartplug.html )
* [Bulbs ](https://python-kasa.readthedocs.io/en/latest/smartbulb.html )
* [Dimmers ](https://python-kasa.readthedocs.io/en/latest/smartdimmer.html )
* [Power strips ](https://python-kasa.readthedocs.io/en/latest/smartstrip.html )
* [Light strips ](https://python-kasa.readthedocs.io/en/latest/smartlightstrip.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
2020-05-12 10:11:47 +00:00
Contributions are very welcome! To simplify the process, we are leveraging automated checks and tests for contributions.
2017-10-13 21:27:05 +00:00
2020-05-12 10:11:47 +00:00
### Setting up development environment
2020-07-12 21:07:24 +00:00
To get started, simply clone this repository and initialize the development environment.
We are using [poetry ](https://python-poetry.org ) for dependency management, so after cloning the repository simply execute
`poetry install` which will install all necessary packages and create a virtual environment for you.
2020-05-12 10:11:47 +00:00
### Code-style checks
2020-07-12 21:07:24 +00:00
We use several tools to automatically check all contributions. The simplest way to verify that everything is formatted properly
before creating a pull request, consider activating the pre-commit hooks by executing `pre-commit install` .
This will make sure that the checks are passing when you do a commit.
You can also execute the checks by running either `tox -e lint` to only do the linting checks, or `tox` to also execute the tests.
2021-09-19 21:45:48 +00:00
### Running tests
You can run tests on the library by executing `pytest` in the source directory.
This will run the tests against contributed example responses, but you can also execute the tests against a real device:
```
2023-12-06 21:54:14 +00:00
$ pytest --ip < address >
2021-09-19 21:45:48 +00:00
```
Note that this will perform state changes on the device.
2020-07-12 21:07:24 +00:00
### Analyzing network captures
The simplest way to add support for a new device or to improve existing ones is to capture traffic between the mobile app and the device.
After capturing the traffic, you can either use the [softScheck's wireshark dissector ](https://github.com/softScheck/tplink-smartplug#wireshark-dissector )
or the `parse_pcap.py` script contained inside the `devtools` directory.
2023-12-06 21:54:14 +00:00
Note, that this works currently only on kasa-branded devices which use port 9999 for communications.
2020-05-12 10:11:47 +00:00
2020-07-12 20:46:21 +00:00
## Supported devices
2023-12-06 21:54:14 +00:00
In principle, most kasa-branded devices that are locally controllable using the official Kasa mobile app work with this library.
The following lists the devices that have been manually verified to work.
2024-01-23 10:14:59 +00:00
**If your device is unlisted but working, please open a pull request to update the list and add a fixture file (use `python -m devtools.dump_devinfo` to generate one).**
2022-10-17 16:16:40 +00:00
2020-07-12 20:46:21 +00:00
### Plugs
* HS100
* HS103
* HS105
* HS107
* HS110
2022-05-11 14:02:17 +00:00
* KP100
2021-10-25 07:17:35 +00:00
* KP105
2021-09-21 17:20:59 +00:00
* KP115
2022-06-27 01:39:57 +00:00
* KP125
2024-01-23 10:14:59 +00:00
* KP125M [See note below ](#newer-kasa-branded-devices )
2021-10-25 07:17:35 +00:00
* KP401
2022-06-27 15:26:45 +00:00
* EP10
2024-01-23 10:14:59 +00:00
* EP25 [See note below ](#newer-kasa-branded-devices )
2020-07-12 20:46:21 +00:00
### Power Strips
2020-07-19 20:32:17 +00:00
2021-10-25 07:17:35 +00:00
* EP40
2020-07-12 20:46:21 +00:00
* HS300
* KP303
2023-07-22 21:55:42 +00:00
* KP200 (in wall)
2020-12-09 09:13:14 +00:00
* KP400
2023-06-30 00:53:23 +00:00
* KP405 (dimmer)
2020-07-12 20:46:21 +00:00
### Wall switches
2020-07-19 20:32:17 +00:00
2022-06-28 11:06:34 +00:00
* ES20M
2020-07-12 20:46:21 +00:00
* HS200
* HS210
* HS220
2023-09-13 11:58:19 +00:00
* KS200M (partial support, no motion, no daylight detection)
* KS220M (partial support, no motion, no daylight detection)
2022-06-28 10:56:36 +00:00
* KS230
2020-07-12 20:46:21 +00:00
### Bulbs
2020-07-19 20:32:17 +00:00
2020-07-12 20:46:21 +00:00
* LB100
* LB110
* LB120
* LB130
* LB230
2021-10-25 07:17:35 +00:00
* KL50
2020-07-12 20:46:21 +00:00
* KL60
* KL110
* KL120
2021-02-27 14:09:33 +00:00
* KL125
2020-07-12 20:46:21 +00:00
* KL130
2021-11-19 17:08:20 +00:00
* KL135
2020-07-12 20:46:21 +00:00
2020-07-19 20:32:17 +00:00
### Light strips
2023-12-08 13:55:14 +00:00
* KL400L5
* KL420L5
2020-07-19 20:32:17 +00:00
* KL430
2024-01-23 10:14:59 +00:00
### Tapo branded devices
2023-12-06 21:54:14 +00:00
2023-12-08 13:55:14 +00:00
The library has recently added a limited supported for devices that carry Tapo branding.
2023-12-06 21:54:14 +00:00
At the moment, the following devices have been confirmed to work:
2024-01-23 10:14:59 +00:00
#### Plugs
* Tapo P110
2024-01-24 08:36:45 +00:00
* Tapo P125M
2024-01-23 10:14:59 +00:00
* Tapo P135 (dimming not yet supported)
2024-01-31 17:30:19 +00:00
* Tapo TP15
2024-01-23 10:14:59 +00:00
#### Bulbs
* Tapo L510B
2024-01-24 08:36:45 +00:00
* Tapo L510E
2024-01-23 10:14:59 +00:00
* Tapo L530E
#### Light strips
* Tapo L900-5
* Tapo L900-10
* Tapo L920-5
2024-01-24 22:31:01 +00:00
* Tapo L930-5
2024-01-23 10:14:59 +00:00
2024-01-25 07:54:56 +00:00
#### Wall switches
* Tapo S500D
2024-01-25 08:07:01 +00:00
* Tapo S505
2024-01-25 07:54:56 +00:00
2024-01-29 17:14:30 +00:00
#### Power strips
* Tapo P300
2024-02-01 18:52:57 +00:00
* Tapo TP25
2024-01-29 17:14:30 +00:00
2024-01-23 10:14:59 +00:00
### Newer Kasa branded devices
2023-12-08 13:55:14 +00:00
Some newer hardware versions of Kasa branded devices are now using the same protocol as
Tapo branded devices. Support for these devices is currently limited as per TAPO branded
devices:
* Kasa EP25 (plug) hw_version 2.6
* Kasa KP125M (plug)
2024-01-23 10:14:59 +00:00
* Kasa KS205 (Wifi/Matter Wall Switch)
* Kasa KS225 (Wifi/Matter Wall Dimmer Switch)
2023-12-06 21:54:14 +00:00
2024-01-23 10:14:59 +00:00
**If your device is unlisted but working, please open a pull request to update the list and add a fixture file (use `python -m devtools.dump_devinfo` to generate one).**
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
* [softScheck's github contains lot of information and wireshark dissector ](https://github.com/softScheck/tplink-smartplug#wireshark-dissector )
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 )
2021-02-07 21:25:42 +00:00
### TP-Link Tapo support
2023-12-08 13:55:14 +00:00
This library has recently added a limited supported for devices that carry Tapo branding.
That support is currently limited to the cli. The package `kasa.tapo` is in flux and if you
use it directly you should expect it could break in future releases until this statement is removed.
Other TAPO libraries are:
2023-11-07 01:15:57 +00:00
* [PyTapo - Python library for communication with Tapo Cameras ](https://github.com/JurajNyiri/pytapo )
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 )