こんにちは、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アプリ開発にもチャレンゞしおいたす。