こんにちは、CCCマーケティング株式会社 データベースマーケティング研究所 技術開発ユニットの三浦です。

今回の記事はESPr Door Sensorというドアの開閉を検知するセンサーとIFTTTというWebサービスを活用して我が家の寝室のドアが開閉するとLINEに通知を送るIoTシステムを作った話を紹介します。

システムの全体図

では、今回作ったIoTシステムの全体図をご紹介させて頂きます!

  • 今回作った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を"dooropen", "doorclose"にしています。Send messageの設定でそれぞれ送りたいMessageを記入します。

  • Appletの設定

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

  • 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は両面テープ、磁石はセロテープで固定しています。何度かドアをパカパカして開閉を検知できるベストポジションを探しました。

動いている様子

ドアが開いている状態。

  • 開いてます

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

  • お、反応した!

LINEに通知が届きました。

  • 届いた!

使ってみて

結構重宝しています。当初の目的どおり、子供の寝かしつけの時間を把握することができるようになっただけでなく、

ドアが開いた時も通知を流すようにしたことで子供が起きた時間も把握することができるようになりました。つまり子供の睡眠時間を自動的に管理できるようになり、最近ちょっと睡眠時間少ないかも…といったような気づきを得られるようになったのはよかったな、と思っています。

次にやること

ここまでスルーしてきましたが、実はAzureの「Cosmos DB」に記録する部分はまだ出来ていません・・・。ここの部分を次につくっていこうと思っています。

ちなみに・・・家に誰もいないはずなのになぜか「もうねるからしずかにね。」という通知が来たことがありました。あれはかなりゾッとしました・・・。特に何もなかったので、風でも吹いたのかな・・・。

本記事は、CCC MARKETING TECH BLOGを、再編集して転載したものです。

[著者]
三浦 諒一

CCCマーケティング株式会社
データベースマーケティング研究所
技術開発ユニット
ユニットリーダー

流通向けのソフトウェア開発・販売営業、食品卸での営業サポート、銀行向けの審査モデルの開発業務などを経験した後、現職に転向。Tポイントのデータと機械学習やIoTなどの技術を組み合わせて新しい価値提供が出来ないかと日々研究開発に勤しんでいます。「昨日できなかったことを何か一つ出来るようにする」がモットーです。業務では普段はPythonやArduino、Javascriptなどを活用し、最近はKotlinでAndroidアプリ開発にもチャレンジしています。