LoginSignup
13
11

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

Last updated at Posted at 2020-01-08

はじめに

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

先日、「最近寒いので電気毛布のリモート制御にチャレンジする #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 から操作できるようにしたいので調査が必要そうです。

13
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
11