mesh(IoTブロック)とFirebaseのRealtime DatabaseとIFTTTを連携する[初心者向け90分コース]

# 前置き
先日余っていた楽天ポイントでmesh( https://meshprj.com/jp/ )というデバイスを購入しました。
meshは子供でも電子工作を楽しめるように作られたデバイスで、IoTな電子工作やものづくりをお手軽に体験できます。
（少し良い値段なので、子供が自分で手を出すのは難しそうですが。参考: [商品一覧](http://meshprj.com/jp/tag/) ）
meshはIFTTTと連携することができるので、色々遊びがいがありそうです。
早速Firebaseとの連携と試してみましたので、手順を残しておきたいと思います。
meshもFirebaseも今回が初体験でしたので、同じく初めて使う方の参考になれば幸いです。

# ゴール
* meshからIFTTT経由でFirebaseのRealtime Databaseにデータを登録すること
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/f5c762cd-37a9-69da-265e-a17197c04a05.png)

#  想定読者
* Firebaseを使ったことがない人
* meshを初めて使う人、もしくは使用歴が浅い人
* IFTTTの使用歴が浅い人

#  手順
## 1. meshの設定（残り90分）
この部分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/8e318b01-6138-84b5-3a04-8f06a04e698c.png)

### 初期設定
初期設定については公式のサポートページに動画付きで解説されていますので、そちらを参考にしてもらうのがいいと思います。
[MESHの初期設定や使い方がわかりません。説明書はありますか？](https://support.meshprj.com/hc/ja/articles/211940358-MESH%E3%81%AE%E5%88%9D%E6%9C%9F%E8%A8%AD%E5%AE%9A%E3%82%84%E4%BD%BF%E3%81%84%E6%96%B9%E3%81%8C%E3%82%8F%E3%81%8B%E3%82%8A%E3%81%BE%E3%81%9B%E3%82%93-%E8%AA%AC%E6%98%8E%E6%9B%B8%E3%81%AF%E3%81%82%E3%82%8A%E3%81%BE%E3%81%99%E3%81%8B-)

## 2. Firebase Realtime Databaseの設定（残り70分）
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/9fe0de8c-756b-95ed-574a-c1bd564188e1.png)

### Firebaseプロジェクトの作成
FirebaseはGoogleが提供するバックエンド環境のサービスです。
Googleアカウントにログインしている状態で「 https://console.Firebase.google.com/?hl=ja 」にアクセスします。

#### 料金について
デフォルトの状態では「Sparkプラン」という無料のプランになっています。
プランの詳細  https://Firebase.google.com/pricing/?authuser=0
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/3d285973-a672-2ddc-fd2c-efdbc75d32d2.png)

 「プロジェクトを追加」を選択してプロジェクトを作成します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/ccabc90b-7287-3837-c664-28d35aa5445f.png)

必要事項を入力し、「プロジェクトを作成」を実行します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/a7c35aa0-7d64-29c6-d2c2-1f2840c00840.png)

プロジェクトができました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/bdfd2ecb-e87a-9288-a634-d638e54941fa.png)

### Dababaseの初期設定
画面左のメニューから「Database」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/9a3f1e7a-bc6f-6a2e-e226-e98e90f62285.png)

2018年11月現在、FirebaseのDatabaseは「Cloud Firestore」と「Realtime Database」の2種類から選択することができます。
「Cloud Firestore」はまだベータ版ですが、柔軟性と拡張性に優れているらしいです。
今回はWebhookを利用してデータを登録したいのでRealtimeDatabaseを選択します。
Realtime Databaseの「データベースを作成」を実行
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/be08b86b-7406-adbc-aa79-1773e63bbf0d.png)

「テストモード」を選択して「有効にする」をクリックします。
このテストモードは誰でもデータの読み書きができる状態になるので、セキュリティの観点からは望ましくありません。
今回はこの後に簡単に疎通確認などを行いたいのでテストモードを選択していますが、正式に運用する場合はセキュリティルールを適切に変更してあげる必要があります。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/1fa69c42-d80c-84a8-ea87-6004cf035d90.png)

データのツリー構造を作成します。今回は下記のように設定しました。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/2b57fbc3-4202-b681-a38a-c86e1f29a5ca.png)

### 疎通テスト
ここまででDatabaseの初期設定は完了しました。
curlで疎通テストをしてみます。curlが使えない環境の場合は、POSTリクエストを送信できる方法に読み替えて下さい。 
先ほど作成したDatabaseのツリー構造の上にURLが記載されています。この「URL＋ツリー構造」をリクエスト先とすることで、データを登録することができます。
また、Reatime Databaseはデータをjsonで管理しているので、作成したツリー構造はjsonファイルになっており、URLの末尾には「json」の拡張子をつけます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/ff3cfea1-8f32-aa1e-8b12-6b1d8f489fa3.png)

このようなデータ構造になっている場合の疎通確認用curlコマンドは下記のようになります。 

```
$ curl -X POST -H "Content-Type: application/json" -d '{"test1": "test2"}' https://sample-pjxxxxxxx.Firebaseio.com/items/item.json
```
curlコマンドを実行すると、Databaseの画面表示が代わり、データが登録されていることがわかります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/d47bf264-f1c5-6fdb-6e33-d403982a073c.png)

ここまででDatabaseの作成、初期設定、疎通確認が完了しました。
curlのリクエスト送信先URLは後ほどIFTTTの設定をする際も利用するのでメモを残して置いて下さい。

## 3. IFTTT設定（残り50分）
IFTTTは「gmailに来たメールをslackに通知する」といった具合にWebに繋がる各種アプリを連携させることができるアプリです。
”Applet”という単位で機能を作成し、”何をトリガーにして何を実行するか”という処理を設定することができます。
この部分です。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/b1c692af-a9d1-0088-5e13-4f48a498903a.png)

### IFTTTの初期設定
まずはIFTTT( https://ifttt.com/ )のWebサイトでアカウントを作成します。

### Applet作成
meshアプリからデータを受信して、Firebaseにデータを送信するAppletを作成します。
Appletでは「何が起こった時に（this）」「何をするか（that）」を設定します。 

a. https://ifttt.com/my_Applets にある「New Applet」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/6e651e83-c11e-cc94-b42a-76258ab9fb41.png)

b. 「this」をクリック
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/58e5f4cb-ed81-7440-96fa-d419d0bcdb20.png)

 c. 検索機能を使い、meshアプリを選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/1661b0e7-7322-7ebd-f0c0-b2da28360a24.png)

d. 「Event from MESH app received」を選択
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/90d99320-7207-dc1f-86d9-0548c2eb9f4d.png)

e. Event IDの設定
Appletとmeshアプリをつなぐために必要なEvent IDを設定します。
meshアプリ側では「-」などが使えないようでしたので、アルファベットと数字だけでIDを決めてもらうといいと思います。
このEvent IDは後でmeshアプリ側で入力する必要があります。
今回は「SampleApplet」というEvent IDでAppletを作成します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/12abc503-a712-ec4e-0d41-9b3096f85cc6.png)

f. 「that」をクリック
続いて「何をするか（that）」を設定します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/f9cfa023-102d-3ff6-08be-2ce67fab8e60.png)

g. 検索機能を使い「Webhooks」を選択
Webhooksの機能を使うことで、任意のHTTPリクエストを送信することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/1f3c0450-2adc-dfc4-9b4e-3d40a59d5c5f.png)

h. 「Make a web request」を選択 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/30d83266-4d29-a1e1-19a3-a38d7d4ce899.png)

i. HTTPリクエストの内容を設定する
URLには、Databaseの疎通確認の際使用したURLを入力します。
MethodはPOSTを選択します。
Realtime DatabaseのREST APIではPOST以外のMethodも利用することができます。その他のMethodの機能詳細についてはこちらをご参照下さい。
https://Firebase.google.com/docs/reference/rest/Database/

Content Typeはapplication/jsonを選択します。

Bodyには、POSTで送信するパラメータを指定します。入力欄下部にある「Add Ingredient」を使うことで、Meshで連携可能なデータを自動で入力してくれます。

入力した結果はこのようになります。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/5be4cec2-1354-8ff4-3306-a1ac5e724134.png)

 「Finish」をクリックし、Appletを完成させます。
これでAppletが完成しました。
あとは作成したAppletとMeshのアプリを紐付ければ完成です。

## 4. meshアプリとIFTTTを連携させる（残り30分）
meshのアプリで、先ほど作成したIFTTTのAppletにデータ送信する設定をします。
この部分です。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/3cc54ce9-1248-b7e1-8801-fceff6c11a7d.png)

meshアプリを起動し、「meshタグ」と「タイマー」とを操作スペースに並べます。
今回は温湿度を扱えるタグを使用します。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/2b4bc3ba-ddfe-4cbe-50df-cee5c412f51c.png)

タイマーは「一定の間隔で」を選択します。今回は1分間隔に設定します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/a19263d5-a376-bb7e-1226-d52ea607644f.png)

meshタグは「温度を確認する」を選択し、温度は0-50度に設定します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/7b1bafcc-6d6c-bfda-72b9-3ab329719c38.png)

meshタグとタイマーをつなぎます。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/e5df90fd-5c21-5592-975e-107fc742624f.png)

「連携タグ」の中から「IFTTT」を選択します。 
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/187b9f8f-507b-b399-e7b4-fc9902027948.png)

IFTTTのセットアップをします。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/c858e777-7ae1-9a9b-8c0b-cab6dfc84aa2.png)

meshアプリとIFTTTの設定を行います。
「mesh及びIFTTTのIDとパスワードを使って連携する方法」と、「meshアプリ内で発行されるIFTTT Keyによって連携する方法」があります。
任意の方法で設定してもらったら良いのですが、自分が試した際にはIDパスワードによる認証の場合は上手く連携ができず、Appletの実行が上手くいかない場合があったのでIFTTT Keyによる認証をおすすめします。

「連携タグ」のセットアップが完了したら、IFTTTのタグをmeshタグとつなぎます。

IFTTTタグの設定でEvent IDと送信するデータを設定します。
Event IDはIFTTTのアプリでAppletを作成した際に指定したものです。
Textで指定した内容がIFTTTのAppletに渡され、IFTTTのAppletからFirebaseに送信されます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/5744159f-dc44-d414-7dd4-147dcaaf3e74.png)

## 5. テスト（残り5分）
これで全ての準備が整いました。全体の疎通テストをしてみたいと思います。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/ec87b6d3-1e43-aa61-eef9-d1d35fa5db38.png)

meshアプリで1分毎にタイマーを設定したので、1分間隔で処理が実行されます。
処理の実行状況はIFTTTのActivityから確認することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/9d3c5411-e816-3f51-588a-5a83604f3c71.png)

送信するデータ形式や、送信先のURLが間違っているなどのエラーが発生した場合はこの画面からエラー内容を確認することができます。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/7ac78077-9f6d-bcc0-83da-a7ad7aaf66d3.png)

### 登録されたデータを確認
最後にFirebase  Consoleで登録されたデータを確認してみましょう。
無事に温度が登録できていますね！
![image.png](https://qiita-image-store.s3.amazonaws.com/0/281036/92aedaaa-f6de-49a1-5cb4-94e9114417d8.png)

## 注意事項
今回、FirebaseのRealtime Detabaseでは、誰でもデータの追加と参照ができる設定になっています。扱うデータによっては誰からもアクセスできるのは問題ですし、多大なデータを送信されることで無料プランの枠を超えてしまうことも考えられます。

扱うデータの質やサービスの特性に合わせて適切なアクセス制御を実施することをおすすめします。 

具体的な設定内容については、Google公式の開発者向けチュートリアルが多数用意されているので、そちらを参考にしてもらうのが良いと思います。 

## 最後に
今回meshもFirebaseもIFTTTも初体験だったのですが、サーバの設定など気にすることなくサクサクと機能が作れるので楽しいですね。

温度と湿度のデータをFirebaseのHostingでグラフにして表示させたりもしたので、また別の記事で手順を残しておきたいと思います。