You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过PlugP100或Python-Kasa跨网络控制TP-Link Tapo智能插座

跨网络控制TP-Link智能插座的解决方案

你目前使用PlugP100和Python-Kasa库在同一局域网内控制TP-Link智能插座,但跨网络时因无法获取设备IP导致无法控制,以下是几种可行的解决方案:

一、官方云服务控制(最简便)

TP-Link的Kasa和Tapo系列设备均支持官方云服务,通过绑定账号即可实现远程控制,无需依赖本地IP。现有库已集成云功能,可以直接使用:

Python-Kasa 云控制示例

import asyncio
from kasa import Cloud

EMAIL = "你的Kasa账号邮箱"
PASSWORD = "你的Kasa账号密码"

async def main():
    # 登录Kasa云平台
    cloud = await Cloud.connect(EMAIL, PASSWORD)
    # 获取账号下所有绑定的设备
    devices = await cloud.get_devices()
    
    # 根据设备名称找到目标并控制
    for dev in devices:
        if dev.alias == "你的插座名称":
            await dev.turn_on()
            await dev.update()
            print(f"已控制设备 {dev.alias} 开启")
    
    await cloud.close()

asyncio.run(main())

PlugP100 云控制示例

import asyncio
from plugp100 import TapoApiClient, AuthCredential

EMAIL = "你的Tapo账号邮箱"
PASSWORD = "你的Tapo账号密码"

async def tapo_remote_control():
    credentials = AuthCredential(EMAIL, PASSWORD)
    # 通过云账号初始化客户端
    cloud_client = await TapoApiClient.from_cloud(credentials)
    # 获取所有绑定的Tapo设备
    device_list = await cloud_client.get_devices()
    
    for device_info in device_list:
        if device_info.nickname == "你的Tapo插座名称":
            # 获取设备控制实例
            device = await cloud_client.get_device(device_info.device_id)
            await device.turn_on()
            await device.update()
            print(f"已控制Tapo设备 {device_info.nickname} 开启")
    
    await cloud_client.close()

asyncio.run(tapo_remote_control())

二、MQTT中转方案

如果不想依赖官方云,可以通过MQTT实现跨网络控制,核心思路是在设备所在局域网部署一个代理脚本,将本地设备状态同步到公网MQTT服务器,远程端通过MQTT发送指令,代理脚本转发给本地设备:

本地代理脚本示例(基于Python-Kasa + MQTT)

import asyncio
from kasa import Discover
import paho.mqtt.client as mqtt

# 配置参数
MQTT_BROKER = "公网MQTT服务器地址"
MQTT_USER = "MQTT用户名"
MQTT_PASS = "MQTT密码"
TARGET_DEVICE_ALIAS = "卧室插座"

target_device = None
mqtt_client = mqtt.Client()

# MQTT消息回调:处理远程控制指令
def on_mqtt_message(client, userdata, msg):
    global target_device
    payload = msg.payload.decode().strip()
    if msg.topic == f"device/{TARGET_DEVICE_ALIAS}/set":
        asyncio.create_task(control_device(payload))

# 控制设备并同步状态到MQTT
async def control_device(state):
    global target_device, mqtt_client
    if not target_device:
        print("设备未初始化")
        return
    
    if state == "on":
        await target_device.turn_on()
    elif state == "off":
        await target_device.turn_off()
    else:
        print("无效指令,仅支持 'on' 或 'off'")
        return
    
    await target_device.update()
    # 发布设备状态到MQTT
    mqtt_client.publish(f"device/{TARGET_DEVICE_ALIAS}/state", "on" if target_device.is_on else "off")

# 初始化本地设备
async def init_local_device():
    global target_device
    devices = await Discover.discover()
    for dev in devices.values():
        if dev.alias == TARGET_DEVICE_ALIAS:
            target_device = dev
            await dev.update()
            # 发布初始状态
            mqtt_client.publish(f"device/{TARGET_DEVICE_ALIAS}/state", "on" if dev.is_on else "off")
            print(f"已连接本地设备: {dev.alias}")
            break

async def main():
    global mqtt_client
    # 初始化MQTT客户端
    mqtt_client.username_pw_set(MQTT_USER, MQTT_PASS)
    mqtt_client.on_message = on_mqtt_message
    mqtt_client.connect(MQTT_BROKER, 1883, 60)
    mqtt_client.subscribe(f"device/{TARGET_DEVICE_ALIAS}/set")
    mqtt_client.loop_start()

    # 初始化本地设备
    await init_local_device()

    # 定期同步设备状态(每30秒一次)
    while True:
        await asyncio.sleep(30)
        if target_device:
            await target_device.update()
            mqtt_client.publish(f"device/{TARGET_DEVICE_ALIAS}/state", "on" if target_device.is_on else "off")

if __name__ == "__main__":
    asyncio.run(main())

远程控制示例(发送MQTT指令)

你可以用任何MQTT客户端(比如MQTTX、Python脚本)发送指令:

import paho.mqtt.client as mqtt

MQTT_BROKER = "公网MQTT服务器地址"
MQTT_USER = "MQTT用户名"
MQTT_PASS = "MQTT密码"

client = mqtt.Client()
client.username_pw_set(MQTT_USER, MQTT_PASS)
client.connect(MQTT_BROKER, 1883, 60)
# 发送开启指令
client.publish("device/卧室插座/set", "on")
client.disconnect()

三、其他替代方案

  1. VPN连接:通过WireGuard、OpenVPN等工具建立VPN连接到目标局域网,此时你的控制设备相当于处于同一网络,可直接使用原有本地控制代码,无需修改。
  2. 内网穿透+端口转发:如果目标网络有公网IP,可在路由器上配置端口转发,将设备控制端口映射到公网,再用DDNS解析动态域名代替IP;也可以用Ngrok等内网穿透工具临时暴露本地服务,适合测试场景。
  3. 本地Web中转服务:在目标局域网部署一个简单的Web服务(比如FastAPI),提供控制接口,远程端通过HTTP请求调用接口控制设备,服务再转发指令给本地插座。

内容的提问来源于stack exchange,提问作者Gray

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 21:54:52