LAN上のTP-Linkスマートプラグを操作できるライブラリtplink-smarthome-apiを使ってみた

2021.01.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

TP-Linkから販売されているスマートプラグをはじめとするIoT製品を操作できるtplink-smarthome-apiというオープンソースのNode.js用ライブラリを使うと、TP-Linkデバイスが設置してあるLAN上でラズパイ等からデバイスを直接操作できます。本記事では、このtplink-smarthome-apiを使用してTP-Linkスマートプラグを操作する手順をご紹介します。

(The English version is available here.)

準備

tplink-smarthome-apiの実行環境には、 ラズパイ3B+を使用しました。制御対象のTP-Linkデバイスには、スマートプラグのHS105を使用しました。

動作確認環境は以下のとおりです:

  • ハードウェア: Raspberry Pi 3B+
    • OS: Raspbian Buster
  • tplink-smarthome-api: 3.1.0
  • node: v10.21.0
  • HS105
    • hardware version: 2.0
    • F/W version: 1.0.7

スマートプラグに付属するマニュアルを参照して、プラグ自体を利用可能な状態にセットアップします。山本さんのブログに手順がわかりやすく書いてあります。

tplink-smarthome-apiはnpmコマンドでインストールします。

npm install tplink-smarthome-api

tplink-smarthome-apiでスマートプラグをON/OFFするコードを説明します。動作確認はNodeのREPL上で簡単に行えます。まずtplink-smarthome-apiのNPMモジュールを読み込み、Clientクラスのインスタンスを取得します。

> client = new (require('tplink-smarthome-api').Client)();

plugNameに制御対象デバイスの登録名を指定します。登録名とはKasaアプリにプラグを登録する時につけた名前のことです。

> plugName = 'smartplug001';

ClientクラスのstartDiscoveryメソッドを実行し、LAN上で操作可能な状態になっているプラグの探索を開始します。デバイスが見つかった時に実行されるコールバックの引数に見つかったデバイスを操作するためのデバイスオブジェクトがセットされます。デバイスオブジェクトのgetSysInfoメソッドで取得したデバイス情報のaliasに登録名がセットされています。client.startDiscovery()client.stopDiscovery()が実行されるまでデバイスの探索を継続するので、見つけたいデバイスがすべて見つかったらstopDiscoveryを実行してデバイスの探索を終了します。

> plug = undefined;
> client.startDiscovery().on('device-online', async (device) => {
    info = await device.getSysInfo();
    plug = device;
    if (info.alias === plugName) {
        console.log('stopping device discovery...');
        client.stopDiscovery();
    }
})

スマートプラグをON/OFFするには、見つかったスマートプラグのデバイスオブジェクトのsetPowerStateメソッドを実行します。

> plug.setPowerState(false) # power off
> plug.setPowerState(true) # poser on

以下はラズパイ上でtplink-smarthome-apiを使ってLAN上のスマートプラグのON/OFFをしてみた結果の動画です。NodeのREPL上でsetPowerState()メソッドを実行することで、プラグ実機がOn/Offされています。Kasaアプリ上のデバイスのOn/Off状態もきちんと追従しています。

まとめ

LAN上のTP-Linkのスマートプラグをtplink-smarthome-apiで操作してみました。TP-Linkデバイスは、 純正のKasaアプリまたはIFTTTを利用することで、TP-Linkのサーバーを介してインターネット越しに遠隔操作できますので、通常はtplink-smarthome-apiの出番は無いかもしれません。もし自宅サーバ等が設置されている環境があって、ホームオートメーションで凝ったことをしたいような場合には、このtplink-smarthome-apiが役立つこともあるでしょう。

補足

npmコマンド実行時エラーになった時の対処法

ラズパイ上でnpm search tplink-smarthome-apiを実行した時に、以下のようなエラーが発生しました。

$ npm search tplink-smarthome-api
npm WARN npm npm does not support Node.js v10.21.0
npm WARN npm You should probably upgrade to a newer version of node as we
npm WARN npm can't make any promises that npm will work with this version.
npm WARN npm Supported releases of Node.js are the latest release of 4, 6, 7, 8, 9.
npm WARN npm You can find the latest version at https://nodejs.org/
NAME                      | DESCRIPTION          | AUTHOR          | DATE       | VERSION  | KEYWORDS
tplink-smarthome-api      | TP-Link Smart Home…  | =plasticrake    | 2020-10-13 | 3.1.0    | tplink kasa hs100 hs10

こちらの記事を参考にして、npmディレクトリのオーナーを自分のアカウントに変更することでエラー解消できました。

$ sudo chown -R $(whoami) $(npm config get prefix)/{lib/node_modules,bin,share}

参照