スマートコンセント(HS105)を使って電気毛布を自動ON/OFF制御する #SleepTech


はじめに

こんにちは。電気毛布を自動制御しようと頑張っているエンジニアです。

先日、「最近寒いので電気毛布のリモート制御にチャレンジする #SleepTech」で、サーボモータを使って電気毛布のつまみを自動で上下させようとしたのですが、
電気毛布コントローラーの固定が甘かったせいでうまくいきませんでした。

そこで、今回は「tp-link製のスマートコンセントHS105」を使って、電気毛布のON/OFF制御をしていこうと思います。

前提

本記事は、「快適な睡眠を目指して寝床内気象を測定する(温度編) #sleeptech」で作った仕組みの拡張です。
先にお読みいただくと、より理解しやすいかと思います。

用意したもの

全体イメージとシステムイメージ

シンプルに、1分毎に布団の温度を測り、電気毛布のON/OFFを制御します。
ON/OFFする部分にHS105を使用していきます。

システムイメージは以下のようになります。

HS105

初期設定をする

公式サイトのFAQ「アプリ「Kasa」でミニ スマートWi-Fiプラグの初期設定をするには」がめちゃくちゃわかりやすいので、そちらをご覧ください。
以降は、HS105がWifiにつながっている前提の手順となります。

Node.jsで操作する

HS105をNode.jsで操作できるライブラリ(tplink-smarthome-api)が公開されているので、ありがたくこちらを使用していきます。

IPアドレスを調べる

HS105を操作するために、割り当てられているローカルIPアドレスが必要です。
tplink-smarthome-apiのCLIを使って簡単に調べられます。

まずはCLIをインストール。

$ npm install -g tplink-smarthome-api

searchコマンドを実行する。

$ tplink-smarthome-api search

結果の中にHS105に割り当てられているIPアドレスが表示されるので、コピーしておきます。
私の場合は、192.168.10.3でした。
以降のソースでは、このIPアドレスを使用して記述しますので、実行する場合は自身のIPアドレスに書き換えて実行してください。

$ tplink-smarthome-api search

Searching...
startDiscovery({
  discoveryInterval: 2000,
  discoveryTimeout: 10000,
  breakoutChildren: true
})
HS105(JP) plug IOT.SMARTPLUGSWITCH 192.168.10.3 9999 XXXXXXXXXXX XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
                                   ^^^^^^^^^^^^

実際にON/OFFしてみる

https://github.com/plasticrake/tplink-smarthome-api/blob/master/examples/plug-turn-on-off.jsのコードを実行してみます。

const { Client } = require('tplink-smarthome-api');

const client = new Client();

const plug = client.getPlug({ host: '192.168.10.3' }); // 各自のIPアドレスに書き換え
plug.setPowerState(true);
plug.setPowerState(false);

実行するとこんな感じで動く。

布団の温度からON/OFFを制御する

obniz + 温度センサーから取得した温度を元に、HS105を制御します。
obnizとHS105の使い方さえわかれば、非常にシンプルなプログラムで動かすことができます。

const Obniz = require('obniz');
const obniz = new Obniz(process.env.OBNIZ_ID);
const { Client } = require('tplink-smarthome-api');
const MAX = 100;

const callback = async () => {
  obniz.connect(); // obnizに接続
  await obniz.connectWait();
  const tempsens = obniz.wired('LM35DZ', { gnd: 0, output: 1, vcc: 2 });

  const client = new Client(); // HS105に接続
  const plug = client.getPlug({ host: '192.168.10.3' }); // 各自のIPアドレスに書き換え

  let temperature = 0; // obnizの温度センサーから温度を取得(バラつきがあるので100回平均している)
  for (let i = 0; i < MAX; i++) {
    temperature += await tempsens.getWait();
    await obniz.wait(10);
  }
  temperature /= MAX;

  if (temperature < 32) { // 温度に応じてHS105をON/OFF
    plug.setPowerState(true);
  } else {
    plug.setPowerState(false);
  }

  obniz.close(); // 繰り返し実行するので1回毎に切断する
  plug.closeConnection();
};

setInterval(callback, 60000); // 1分毎に実行する

実際に使ってみる

大晦日に作成してから使い続けていますが、今までと比べるとかなり快適になった気がします。

Ambientというサービスを使って、布団の温度や部屋の温湿度をグラフにしているのですが、昨日のグラフは以下のようになりました。
(左上:布団温度、右上:HS105のON/OFF、左下:寝室気温、右下;寝室湿度)

  • 布団温度を見てみると、およそ30℃~37℃の範囲で推移しているようです。平均は33℃前後でしょうか。
    • プログラムを少し改良して、午後10時~翌朝8時までの間で電気毛布を制御するようにしました。
    • 電気毛布がOFFの時間になると20℃前後で推移するようです。
    • それにしても測定誤差が大きいですね。10%程度はありそう。センサーや測定方法を検討する必要がありそうです。
  • HS105のON/OFFは頻繁に切り替わっており、1時間に数回~十数回は切り替わっています。
    • 切り替わるたびにカチッカチッとリレーが切り替わるような音がします。少し気になりますが、もう慣れました。
  • 寝室気温は、18℃前後からほとんど変わらないようです。
  • 寝室湿度は、加湿器を強めにつけているので、朝まではずっと湿度95%でした。(センサーの上限が95%なので実際は100%かもしれません)

まとめ

簡単に作成した割には、満足のいく出来となりました。
早いところ誰かに使ってもらってフィードバックをもらいたいところです。

HS105のライブラリを使うと、同一LANにいる端末からしか操作ができないようでした。
そのためノートPCから制御をかけているのですが、後々はAWS Lambdaから操作できるようにしたいので調査が必要そうです。