それ AtomS3 Lite でできたよ
概要
AtomS3 Lite のボタンで TP-Link P105 スマートプラグを操作できるようにした顛末
はじめに
スマートホーム関連商品としてスマートボタンというものが製品化されており、それを使えばスマートボタンを押すとスマートプラグを ON/OFF するといったことは可能なのですが、インターネット不通時に使えないとかインターネット経由で処理するので反応が遅いという問題があります。そこで AtomS3 Lite から TP-Link P105 に直接通信することによって問題を解決してみました。
TP-Link P105
数多く製品化されているスマートプラグのなかから、プロトコルが既知で低価格 (1000円程度) かつ入手性が良い TP-Link P105 を選定しました。
プロトコル
P105 のプロトコルはプロプライエタリなのですが数多くの実装が公開されています。いくつかソースコードを確認してみると http 通信で以下のシーケンスで通信すればよいことがわかりました。比較的簡単ですが、やり取りするデータが暗号化されたり base64 符号化されたりハッシュだったりして平文ではないのでハマるとバグを探すのが面倒だったりします。詳細はサンプルコードを参照してください。
P105 Client
| handshake |
| <-------- | ; key
| --------> | ; key, sessionID and timeout
| |
| login |
| <-------- | ; username(sha1), password and sessionID
| --------> | ; token
| |
| API calls |
| <-------- | ; token
| --------> |
| ... |
実装
試しに拾ってきたコードを使って動作させてみると動かない・遅いといった問題があったので、チューニングして動画くらいの反応時間となりました。また(たまに失敗してリトライが走るので)ボタンを押してから処理が終わるまで LED を点灯させています。
サンプルコード
https://github.com/sokosun/atoms3_p105_control/
そのほか
- TP-Link のスマートプラグはあるユーザが使用中に別のユーザが使用しようとするとビジーを返す
- terminalUUID はなんでも通るっぽいが、同じ terminalUUID で (キー生成から) 繰り返し通信するとエラーが返ってくる
- requestTimeMils に常時 0 を設定するとエラーが返ってくることがある (ファームウェアのバージョン依存らしい)
- login で間違った username/password を送ってもエラーなしと返答したりする (API call 時にエラーが返ってくる)
参考
- https://gitlab.com/0xSamy/TapoPlug-Rest-API
- https://github.com/fishbigger/TapoP100
- ESP8266 で Tp-Link のスマートプラグ『Tapo P105』を直接操作する https://guminote.sakura.ne.jp/archives/911
- TP-LINK TAPO P100/P105をESP32から直接制御する https://lab.sasapea.mydns.jp/2020/11/26/tapo_esp32/