AndroidアプリでFirebase Realtime DBにセンサーデータを保存、閲覧する

<img width="360" alt="アプリ画面" src="https://qiita-image-store.s3.amazonaws.com/0/1213/03cc98c5-f86c-060d-cc2c-ea7163a542b6.png">


前回の記事、[冷蔵庫の温度湿度を2週間計測した結果](http://qiita.com/kojira/items/b78f75651b0be535c097)で予告していたアプリです。
[Linking](https://linkingiot.com/)のSDKを使ってセンサーから温湿度を取得し、[Firebase](https://firebase.google.com/)のRealtime DBに保存することができます。
[ソースコードはここ](https://github.com/kojira/firebaseposter)に置きました。


# 準備

## ソースコード

まずはGithubからソースコードをClone。

```shell-session
git clone https://github.com/kojira/firebaseposter.git
```

## Android Studio

Android StudioでCloneしたプロジェクトを開きます。

google-services.jsonというファイルが足りないため、ビルドエラーが出ますが、ひとまず無視します。

<img width="659" alt="スクリーンショット 2016-12-06 15.31.33.png" src="https://qiita-image-store.s3.amazonaws.com/0/1213/b87c0bb1-b5b3-ff41-446f-3772f806c403.png">


Firebaseと連携するため、メニューから「Tools」→「Firebase」を選びます。
<img width="274" alt="Firebaseメニュー" src="https://qiita-image-store.s3.amazonaws.com/0/1213/7b0fe189-2d20-6f54-889c-c5a507b7fa23.png">


右側の方にこんなのが出てきます。
<img width="514" alt="Firebase Assistant" src="https://qiita-image-store.s3.amazonaws.com/0/1213/9f749c74-e2b9-0103-14bd-b0db8f264a07.png">


「Realtime Database」の三角をポチッとして、「Save and retrieve data」をクリック。
<img width="515" alt="Realtime DB" src="https://qiita-image-store.s3.amazonaws.com/0/1213/32a12046-6fca-42e5-31d5-6709259b0f40.png">

「Connect to Firebase」をクリック。
<img width="505" alt="Save and retrieve data" src="https://qiita-image-store.s3.amazonaws.com/0/1213/9236a9cd-1cc3-c542-a3a9-b37acc6f62df.png">


Create new Firebase projectを選択して、「Connect to Firebase」をクリック。(※Googleアカウントでサインインしていない場合は多分サインイン画面が出ると思います)
![Connect to Firebase](https://qiita-image-store.s3.amazonaws.com/0/1213/476d6e18-8f00-e196-1503-e9653e569b23.png)


しばらく待つと表示が「Connected」に変わります。
<img width="241" alt="connected" src="https://qiita-image-store.s3.amazonaws.com/0/1213/7325f132-e6ba-a6f7-12f9-0d2b736fbf95.png">


そして「google-services.json」ファイルがプロジェクトに追加されているはずです。
<img width="208" alt="google-services.json" src="https://qiita-image-store.s3.amazonaws.com/0/1213/4c549533-52cf-88a5-2087-97ea631aabf3.png">

これで準備完了！！
・・・いや、まだです。
このままでもアプリは起動しますが、DBの書き込み権限がないので実行時に「Permission denied」のエラーが出てしまいます。


## Firebaseの設定

[Firebaseのコンソール](https://console.firebase.google.com/)を開いてさっき作成したプロジェクトを選択して開き、左側のメニューの「Database」を選択。
<img width="140" alt="Databaseメニュー" src="https://qiita-image-store.s3.amazonaws.com/0/1213/9530b784-053c-008c-bd4d-757b6d5f7326.png">


ルールのタブをクリック。
<img width="403" alt="Realtime Database" src="https://qiita-image-store.s3.amazonaws.com/0/1213/5cd9df16-f8dd-c752-1f21-2833d885b84b.png">


デフォルトの設定だと認証が必要になっているので、
<img width="506" alt="DBルール1" src="https://qiita-image-store.s3.amazonaws.com/0/1213/49c4d87f-fed8-d942-191e-23d72e184779.png">


このように書き換えて「公開」ボタンをクリック。(※あくまで個人利用で公開しない目的での利用を想定しています。商用等で運用する場合はちゃんとしましょう。)
<img width="484" alt="DBルール2" src="https://qiita-image-store.s3.amazonaws.com/0/1213/b331428c-6ac2-3339-54d2-3c669dd4acc2.png">

```json
{
  "rules": {
    ".read": true,
    ".write": true
  }
}
```

これで今度こそ準備OKです。


## 念のため

[Linking](https://linkingiot.com/)ってなんぞや？っていう人は、[Linkingの端末をもらったのでデモアプリを試してみた](http://qiita.com/kojira/items/a8cdf4b499efb06887ea)を参考に、Linkingのアプリを入れてデバイスと接続しておきましょう。


# 使い方

<img width="360" alt="アプリ画面" src="https://qiita-image-store.s3.amazonaws.com/0/1213/03cc98c5-f86c-060d-cc2c-ea7163a542b6.png">

1. Realtime DBに保存するデータのキーとなる文字列を「root path」のところに入れます。
2. デバイスのリストからセンサー情報を拾いたいデバイスを選択します。
3. そのデバイスで取得できるセンサー情報(現在は加速度、湿度、温度の3種類のみ対応)にチェックを入れます。
4. 「START」ボタンでデータ取得を開始します。
5. 「GET」ボタンを押すと最新の10件を取得してリストに表示されます。データが更新される度にリストに情報が追加されていきます。


Firebaseコンソールで見ると、こんな感じにデータが格納されます。
<img width="393" alt="データ" src="https://qiita-image-store.s3.amazonaws.com/0/1213/b9755298-ddcf-e0ff-489d-a8c6d092f89e.png">

加速度のデータは量が多いので気をつけましょう。


疲れたので今回はひとまずここまで。


# 追伸
 [冷蔵庫の温度湿度を2週間計測した結果](http://qiita.com/kojira/items/b78f75651b0be535c097)の記事で計測を始めた冷蔵庫の温湿度計測は以下のサイトでリアルタイム公開していましたが、現在新規のデータ取得は停止中です。
[kojira家の冷蔵庫のおんどしつど](https://postposter-37901.firebaseapp.com/)

理由は計測に使用していたNexus 4のバッテリーが膨らんできたからです。
約2ヶ月間給電し続けたせいでバッテリーがイカれてしまったようです。。
<img width="360" alt="哀れなNexus 4" src="https://qiita-image-store.s3.amazonaws.com/0/1213/f2132bc7-8660-8d4f-8d6a-79cbdf57e577.jpeg">


常時給電しても問題ないNexus Playerで同様のことができないか試行錯誤中です。
(※自宅の環境だと何故か2m以内くらいしか電波受信しないのでどうしようか悩み中。)