もうすぐ春ですね
こんにちは、研究所の三浦です。まだ寒い日もありますが、なんとなく風が柔らかくなってきて春っぽくなってきたな~と感じる今日このごろです。散歩がはかどります。

今回つくったもの!
今回は最近つくったIoTシステムを紹介させて頂きます!まずは全体図を。

名付けて「もう寝るから静かに帰ってきてシステム」です。動きを簡単にまとめると、子供を寝かしつけるために寝室のドアを閉めると三浦家のLINEグループに「もうねるからしずかにね。」という通知が流れます。ここには書いてないのですが、ドアが開いたときは「ドアがひらいたよ。」という通知も流れます。さらにドアの開閉が発生した時間をMicrosoftのクラウド「Azure」のドキュメントデータベース「Cosmos DB」に「Azure Functions」経由で記録するというシステムです。このシステムをつくるに至った背景を説明します。
背景①トイレ一杯問題
そもそもの始まりは会社のトイレ一杯問題でした。多分よくある話だと思うのですが、会社のトイレの個室が一杯になる時間帯があって、せっかくトイレまで行ったのにトイレが使えない、ということがあるようで、自席からトイレの使用状況を確認することができないか?という相談を受けました。調べてみるとそういったシステムを提供している会社はあるみたいで、結構この問題に悩んでいる人たちは多いみたいです。技術的にはトイレのドアにマグネットのセンサーを付けてドアの開閉を検知する方法がよく取られているみたいです。いろいろ見ていると自分で扱えそうなセンサーを見つけたので試しに取り寄せて調査・実験してみることにしました。とはいえいきなりトイレにセンサーを取り付けると何も知らない人からすれば「何かあやしいことをしている・・・」と思われるかもしれません。そんな度胸は無いのでまずは別の用途で試し、実績をつくってみようと考えました。
背景②我が家の問題
実は前からなんとかしたいな、と思っていた問題が我が家にはありました。我が家は共働きなので、どちらか早く帰る方が子供の寝かしつけを担当しています。寝かしつけ中に帰ってこられると、玄関のドアが開く音や廊下を歩く音で寝かしつけを邪魔してしまうことがありました。これはケンカのタネになりかねません。家庭の平和のためにも寝かしつけが始まったことを、なんらかの方法でお互い知ることができたらいいのに、と思っていました。普段寝室のドアは空気を入れ替えるために開けていて、寝かしつけを始めるタイミングでドアを閉めるので、先程のセンサーを使えば解決できるじゃない!そんなこんなで考えたのが前述したIoTシステムです。
IFTTTでLINEと連携する
まずドアセンサーとLINEを連携するため、IFTTTというWebサービスを利用しました。
IFTTT: Every thing works better together
IFTTTは様々なWebサービスをプログラミング不要で連携することができるWebサービスです。IFTTTは「IF This Then That」の頭文字を取ったもので、その文字通り「もしこれが起きたらあれをする」というように「きっかけ」と「実行すること」を指定し、Appletとして登録します。ここでは「きっかけ」をwebhookの"Receive a web request"、「実行すること」をLINEの"Send message"にします。ドアが開いた時・閉まった時でそれぞれAppletを作成し、それぞれEvent Nameを"door_open", "door_close"にしています。Send messageの設定でそれぞれ送りたいMessageを記入します。

リクエストを投げるURLはこちらから確認することができます。

使用したドアセンサー
「ESPr Door Sensor」というドアセンサーを使いました。スイッチサイエンスさんから購入しました。ESP-WROOM-02というWi-Fiモジュールが搭載されているため、インターネットに簡単に接続することができます。さらに動作するプログラムはArduino言語というC/C++ベースの、これまでも何度か使ってきた言語で書けるのでこのセンサーに決めました。
プログラム
こちらもスイッチサイエンスさんで紹介されているものを参考に作りました。
#include <ESP8266WiFi.h>
extern "C" {
#include "user_interface.h"
}
#define CLOSE 0
const char* ssid = "xxxx"; //接続するWi-Fiのssidを指定します
const char* password = "xxxxxxxx"; //接続するWi-Fiのkeyを指定します
const char* host = "maker.ifttt.com"; //hostにIFTTTを指定
const char* open_url = "/trigger/door_open/with/key/xxxx"; //ドアが開いたときのURL
const char* close_url = "/trigger/door_close/with/key/xxxx"; //ドアが閉まったときのURL
WiFiClient client;
boolean flag = false;
int LED = 4;
int reed_sw = 5;
void setup() {
Serial.begin(115200);
delay(10);
pinMode(LED,OUTPUT);
digitalWrite(LED,HIGH);//Wi-Fi接続試行中はLEDを点灯させる
// We start by connecting to a WiFi network
Serial.println();
Serial.println();
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.println("IP address: ");
Serial.println(WiFi.localIP());
pinMode(reed_sw,INPUT);
digitalWrite(LED,LOW);
}
int value = 0;
void loop() {
int door_state;
door_state = digitalRead(reed_sw);
Serial.print("Door State:");
if(door_state == CLOSE){
Serial.println("Close");
}
else{
Serial.println("Open");
}
// Use WiFiClient class to create TCP connections
const int httpPort = 80;
if (!client.connect(host, httpPort)) {
Serial.println("connection failed");
return;
}
// We now create a URI for the request
String url;
if(door_state == 0){
//ドアが閉まった時
url += close_url;
}
else{
//ドアが開いた時
url += open_url;
}
Serial.print("Requesting URL: ");
Serial.println(url);
// This will send the request to the server
client.print(String("GET ") + url + " HTTP/1.1\r\n" +
"Host: " + host + "\r\n" +
"Connection: close\r\n\r\n");
delay(10);
Serial.println();
Serial.println("closing connection");
ESP.deepSleep(0, WAKE_RF_DEFAULT);//ディープスリープモードに移行
delay(1000);
}
このプログラムをESPr Door Sensorに書き込みます。 ESPr Door Sensorがドアの開閉を検知すると起動し、Wi-Fiへの接続を試みます。接続を試みている間は付属のLEDが光ります。Wi-Fiへの接続が完了すると開閉の状態に応じてリクエストを投げるURLを取得し、URLにリクエストを投げます。完了したら、ディープスリープモードという省電力の状態に移行します。
設置してみる
設置するとこんな感じになります。

ESPr Door Sensorは両面テープ、磁石はセロテープで固定しています。何度かドアをパカパカして開閉を検知できるベストポジションを探しました。
動いている様子
ドアが開いている状態。

閉じるとESPr Door Sensorに付属するLEDが赤く光ます。

LINEに通知が届きました。

使ってみて
結構重宝しています。当初の目的どおり、子供の寝かしつけの時間を把握することができるようになっただけでなく、ドアが開いた時も通知を流すようにしたことで子供が起きた時間も把握することができるようになりました。つまり子供の睡眠時間を自動的に管理できるようになり、最近ちょっと睡眠時間少ないかも…といったような気づきを得られるようになったのはよかったな、と思っています。
次にやること
ここまでスルーしてきましたが、実はAzureの「Cosmos DB」に記録する部分はまだ出来ていません・・・。ここの部分を次につくっていこうと思っています。
ちなみに・・・
家に誰もいないはずなのになぜか「もうねるからしずかにね。」という通知が来たことがありました。あれはかなりゾッとしました・・・。特に何もなかったので、風でも吹いたのかな・・・。