/tapo

Unofficial Tapo API Client. Works with TP-Link Tapo smart devices. Tested with light bulbs (L510, L520, L530, L610, L630), light strips (L900, L920, L930), plugs (P100, P105, P110, P115), hubs (H100), switches (S200B) and sensors (KE100, T100, T110, T300, T310, T315).

Primary LanguageRustMIT LicenseMIT

Tapo

License Crates Documentation Crates.io PyPI Python PyPI
Unofficial Tapo API Client. Works with TP-Link Tapo smart devices. Tested with light bulbs (L510, L520, L530, L610, L630), light strips (L900, L920, L930), plugs (P100, P105, P110, P115), hubs (H100), switches (S200B) and sensors (KE100, T100, T110, T300, T310, T315).

Device support

✓ - Rust only
✅ - Rust and Python

Feature GenericDevice L510, L520, L610 L530, L630, L900 L920, L930 P100, P105 P110, P115
device_reset
get_current_power
get_device_info
get_device_info_json
get_device_usage
get_energy_data
get_energy_usage
off
on
set_brightness
set_color
set_color_temperature
set_hue_saturation
set_lighting_effect
set() API *

* The set() API allows multiple properties to be set in a single request.

Hub (H100) Support

Feature KE100 S200B T100 T110 T300 T310, T315
get_device_info *
get_device_info_json
get_temperature_humidity_records
get_trigger_logs
set_child_protection
set_frost_protection
set_max_control_temperature
set_min_control_temperature
set_target_temperature
set_temperature_offset

* Obtained by calling get_child_device_list on the hub device or get_device_info on a child handler.

Rust

Usage

Cargo.toml

[dependencies]
tapo = "0.7"

main.rs

let device = ApiClient::new("<tapo-username>", "tapo-password")?
    .p110("<device ip address>")
    .await?;

device.on().await?;

Examples

export TAPO_USERNAME=
export TAPO_PASSWORD=
export IP_ADDRESS=

cargo run --example tapo_l530

See all examples in /tapo/examples.

Wrapper REST API

tapo-rest is a REST wrapper of this library that can be deployed as a service or serve as an advanced example.

Python

Usage

pip install tapo
client = ApiClient("<tapo-username>", "tapo-password")
device = await client.p110("<device ip address>")

await device.on()

Examples

cd tapo-py
poetry install
poetry shell

export TAPO_USERNAME=
export TAPO_PASSWORD=
export IP_ADDRESS=
python examples/tapo_p110.py

See all examples in /tapo-py/examples.

Contributing

Contributions are welcome and encouraged! See /CONTRIBUTING.md.

Troubleshooting

1. Installing openssl on Windows

With chocolatey

choco install openssl
[System.Environment]::SetEnvironmentVariable('OPENSSL_DIR', $Env:Programfiles + "\OpenSSL-Win64", "User")

or with vcpkg

git clone git@github.com:microsoft/vcpkg.git
cd vcpkg
./bootstrap-vcpkg.bat
./vcpkg.exe install openssl-windows:x64-windows
./vcpkg.exe install openssl:x64-windows-static
./vcpkg.exe integrate install
[System.Environment]::SetEnvironmentVariable('OPENSSL_DIR', (Get-Location).Path + "\installed\x64-windows-static", "User")

Credits

Inspired by petretiandrea/plugp100.