Local-network control of Tuya-compatible devices, built in Rust with first-class Python bindings. Designed for fleets of hundreds to thousands of devices — a native Rust core handles the I/O while the Python facade releases the GIL on every blocking call, so threaded Python workers stay live.
Rust
cargo add rustuyaPython
pip install rustuyaRust
use rustuya::sync::Device;
let dev = Device::new("DEVICE_ID", "LOCAL_KEY");
dev.set_value(1, true)?; // turn on DP 1
println!("{:?}", dev.status()?); // read current DPS
for msg in dev.listener() { // real-time events
println!("{:?}", msg);
}Python
from rustuya import Device
dev = Device("DEVICE_ID", "LOCAL_KEY")
dev.set_value(1, True) # turn on DP 1
print(dev.status()) # read current DPS
for msg in dev.listener(): # real-time events
print(msg)- Local-only — talks directly to devices over LAN, no Tuya Cloud
- Rust core + Python bindings (PyO3) — same engine for both
- Built for fleet scale — per-device background tasks with automatic reconnection and exponential backoff
- Full protocol coverage — Tuya 3.1 / 3.2 / 3.3 / 3.4 / 3.5 + device22
See the Guide for the full API reference, design philosophy, and architecture notes.
The Tuya protocol layer in rustuya is derived from the specifications and error codes documented in tinytuya:
MIT