使用API调用TPLINK智能插座

最近智能电器的概念很火,但是很多都是傻瓜式的,通过手机应用实现开关,留给自己DIY的空间并不多。

为了实现更多便利的DIY,我们有必要实现通过发送API请求来实现智能电器的控制。

为了实现通过调用API来控制插座通电这个功能,我找到了TPPINK HS105 这个东西。

默认的操作方式是通过手机应用,将智能插座连上自己加的WIFI,注册TPLINK CLOUND账号之后,你的智能插座就可以通过TPLINK CLOUD远程控制了。

具体原理是,你的手机应用发送请求给TPLINK CLOUD,TPLINK CLOUD找到你注册在上面的智能插座,并发送通断命令,这个命令通过你家WIFI传递到你的智能插座上,智能插座作出相应通断。

而我们想要实现的功能是,在和智能插座相连的同一内网中,通过直接向智能插座的HOST发送API来实现智能插座的控制。

与上面的傻瓜方式不同,我的PC(或者树莓派)向智能插座发起控制请求,这个请求通过WIFI的内网直接到达智能插座,智能插座作出相应通断。

为了解决上述DIY需求,我们需要两个东西,一个是这个请求的具体格式,另一个是智能插座在我们内网上的IP地址。

发现智能插座的内网IP

发现内网IP方法有很多种,可以上WIFI的控制页面去查所有链接的设备。可惜我家的WIFI似乎并不提供这一信息,于是,暴力一点,我们向左右内网子网地址广播PING包来侦测链接的设备。

我的子网掩码是24位,所以广播地址是192.168.0.255

1
2
3
4
5
6
7
8
9
10
11
➜  tplink ping 192.168.0.255
PING 192.168.0.255 (192.168.0.255): 56 data bytes
64 bytes from 192.168.0.3: icmp_seq=0 ttl=64 time=0.082 ms
64 bytes from 192.168.0.1: icmp_seq=0 ttl=255 time=3.807 ms
64 bytes from 192.168.0.5: icmp_seq=0 ttl=64 time=6.477 ms
64 bytes from 192.168.0.2: icmp_seq=0 ttl=64 time=37.603 ms
64 bytes from 192.168.0.4: icmp_seq=0 ttl=64 time=38.634 ms
64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.130 ms
64 bytes from 192.168.0.1: icmp_seq=1 ttl=255 time=4.424 ms
64 bytes from 192.168.0.5: icmp_seq=1 ttl=64 time=4.472 ms
64 bytes from 192.168.0.4: icmp_seq=1 ttl=64 time=58.922 ms

1是路由器,2是我的手机,3是我的PC,4是IPAD,那基本上5就是我们的智能家电了。

接下来考虑如何发起请求。

十分庆幸有人已经把所有API包装起来了。我们直接调用封装后的方法就行。

1
2
3
4
5
6
7
const { Client  } = require('tplink-smarthome-api');

const client = new Client();
const plug = client.getDevice({host: your_host_address}).then((device)=>{
device.getSysInfo().then(console.log);
device.setPowerState(true);
});
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
➜  tplink node index.js
{ sw_ver: '1.5.7 Build 180202 Rel.075643',
hw_ver: '1.0',
type: 'IOT.SMARTPLUGSWITCH',
model: 'HS105(JP)',
mac: 'xxxxx',
dev_name: 'Smart Wi-Fi Plug Mini',
alias: '只是个插座',
relay_state: 1,
on_time: 0,
active_mode: 'none',
feature: 'TIM',
updating: 0,
icon_hash: '',
rssi: -47,
led_off: 0,
longitude_i: xxxxx,
latitude_i: xxxxx,
hwId: 'xxxxx',
fwId: '00000000000000000000000000000000',
deviceId: 'xxxx',
oemId: 'xxxx',
tid: '',
err_code: 0 }

后话

陆续等空气质量传感器和温湿度传感器到货之后,可以通过室内的空气质量来控制空气净化器的开关。