Package: python-kasa
python-kasapython-kasa is a Python library to control TPLink's smart home devices (plugs, wall switches, power strips, and bulbs).This is a voluntary, community-driven effort and is not affiliated, sponsored, or endorsed by TPLink.Contributions in any form (adding missing features, reporting issues, fixing or triaging existing ones, improving the documentation, or device donations) are more than welcome!Getting startedYou can install the most recent release using pip:pip install python-kasaIf you are using cpython, it is recommended to install with[speedups]to enable orjson (faster json support):pip install python-kasa[speedups]With[speedups], the protocol overhead is roughly an order of magnitude lower (benchmarks available in devtools).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 installIf you have not yet provisioned your device,you can do so using the cli tool.Discovering devicesRunningkasa discoverwill 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--targetoption.Thediscovercommand will automatically execute thestatecommand 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>If your device requires authentication to control it,
you need to pass the credentials using--usernameand--passwordoptions.Basic functionalitiesAll devices support a variety of common commands, including:statewhich returns state informationonandofffor turning the device on or offemeter(where applicable) to return energy consumption informationsysinfoto return raw system informationThe syntax to control device iskasa --host <ip address> <command>.
Usekasa --help(or consult the documentation) to get a list of all available commands and options.
Some examples of available options include JSON output (--json), defining timeouts (--timeoutand--discovery-timeout).Each individual command may also have additional options, which are shown when called with the--helpoption.
For example,--transitionon bulbs requests a smooth state change, while--nameand--indexare 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.BulbsCommon commands for bulbs and light strips include:brightnessto control the brightnesshsvto control the colorstemperatureto control the color temperaturesWhen executed without parameters, these commands will report the current state.Some devices support--transitionoption 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 30See--helpfor additional options andthe documentationfor more details about supported features and limitations.Power stripsEach individual socket can be controlled separately by passing--indexor--nameto 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--helpfor additional options andthe documentationfor more details about supported features and limitations.Energy meterRunningkasa emetercommand will return the current consumption.
Possible options include--yearand--monthfor retrieving historical state,
and reseting the counters can be done with--erase.$ kasa emeter
== Emeter ==
Current state: {'total': 133.105, 'power': 108.223577, 'current': 0.54463, 'voltage': 225.296283}Library usageIf you want to use this library in your own project, a good starting point is to checkthe documentation on discovering devices.
You can find several code examples in the API documentation of each of the implementation base classes, check out thedocumentation for the base class shared by all supported devices.The library design and module structure is described in a separate page.The device type specific documentation can be found in their separate pages:PlugsBulbsDimmersPower stripsLight stripsContributingContributions are very welcome! To simplify the process, we are leveraging automated checks and tests for contributions.Setting up development environmentTo get started, simply clone this repository and initialize the development environment.
We are usingpoetryfor dependency management, so after cloning the repository simply executepoetry installwhich will install all necessary packages and create a virtual environment for you.Code-style checksWe 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 executingpre-commit install.
This will make sure that the checks are passing when you do a commit.You can also execute the checks by running eithertox -e lintto only do the linting checks, ortoxto also execute the tests.Running testsYou can run tests on the library by executingpytestin the source directory.
This will run the tests against contributed example responses, but you can also execute the tests against a real device:$ pytest --ip <address>Note that this will perform state changes on the device.Analyzing network capturesThe 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 thesoftScheck's  wireshark dissectoror theparse_pcap.pyscript contained inside thedevtoolsdirectory.
Note, that this works currently only on kasa-branded devices which use port 9999 for communications.Supported devicesIn 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.If your device is unlisted but working, please open a pull request to update the list and add a fixture file (usepython -m devtools.dump_devinfoto generate one).PlugsHS100HS103HS105HS107HS110KP100KP105KP115KP125KP125MSee note belowKP401EP10EP25See note belowPower StripsEP40HS300KP303KP200 (in wall)KP400KP405 (dimmer)Wall switchesES20MHS200HS210HS220KS200M (partial support, no motion, no daylight detection)KS220M (partial support, no motion, no daylight detection)KS230BulbsLB100LB110LB120LB130LB230KL50KL60KL110KL120KL125KL130KL135Light stripsKL400L5KL420L5KL430Tapo branded devicesThe library has recently added a limited supported for devices that carry Tapo branding.At the moment, the following devices have been confirmed to work:PlugsTapo P110Tapo P125MTapo P135 (dimming not yet supported)Tapo TP15BulbsTapo L510BTapo L510ETapo L530ELight stripsTapo L900-5Tapo L900-10Tapo L920-5Tapo L930-5Wall switchesTapo S500DTapo S505Power stripsTapo P300Tapo TP25Newer Kasa branded devicesSome 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.6Kasa KP125M (plug)Kasa KS205 (Wifi/Matter Wall Switch)Kasa KS225 (Wifi/Matter Wall Dimmer Switch)If your device is unlisted but working, please open a pull request to update the list and add a fixture file (usepython -m devtools.dump_devinfoto generate one).ResourcesDeveloper ResourcessoftScheck's github contains lot of information and wireshark dissectorTP-Link Smart Home Device SimulatorUnofficial API documentationAnother unofficial API documentationpyHS100provides synchronous interface and is the unmaintained predecessor of this library.Library UsersHome AssistantMQTT access to TP-Link devices, using python-kasaTP-Link Tapo supportThis library has recently added a limited supported for devices that carry Tapo branding.
That support is currently limited to the cli.  The packagekasa.tapois 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:PyTapo - Python library for communication with Tapo CamerasTapo P100 (Tapo plugs, Tapo bulbs)Home Assistant integrationplugp100, another tapo libraryHome Assistant integration