自宅の室温データを自動で収集してTableauで確認する！(NatureRemo/gas/Tableau)

自宅の室温ってどのくらいの幅があるんだろうと気になったので、Nature Remo mini2台を使って室温を取得し、Tableau Publicで可視化してみました。

* 私自身のスキルは以下の通りです。
    * Nature RemoのAPIは初めて触る
    * Google Apps Script（GAS）でのプログラム作成は業務で1度だけ
    * Tableauは業務で触ってから2年くらい

調べながら進めて4時間ほどで完成しました。

![室温.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/08dd12f8-4a64-2182-f646-cb6413de0ba3.png)


完成した室温のダッシュボードは、以下のリンクから見られます。

https://public.tableau.com/views/_16494711332630/sheet4?:language=ja-JP&:display_count=n&:origin=viz_share_link

Nature Remo miniで計測した室温を、1時間ごとにスプレッドシートに書き込んでいます。
そして、毎日11時～12時の間に、Tableauでスプレッドシートから過去24時間分のデータを取得しています（期間：2022/4/6~2023/1/15）。
![00000.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/f07fab20-f7d2-ac9b-a74d-06cffd5d9550.png)

# 開発環境
* OS
    * Windows 11 Home
* ブラウザ
    * Google Chrome
* アプリケーションなど
    * Nature Remo mini 第一世代
    * Google スプレッドシート
    * Tableau Public 2022.1



# Nature Remo miniのアクセストークンを発行する


## そもそもNature Remoとは
>スマートホームを手軽に。進化したリモコン。
Nature Remo（ネイチャーリモ）は、お持ちの家電をスマートフォンから操作できる進化したリモコンです。
赤外線方式のリモコンを備えた家電であれば、メーカーや型番・年式などに関係なく使用可能。

https://nature.global/

今回は、エントリーモデルのNature Remo **mini**の温度センサーとAPI機能を使って開発を行います。
※通常のNature Remoには温度、湿度、照度、人感センサーが搭載されていますが、miniはエントリーモデルのため温度センサーのみ搭載されています。


## Nature Remo Cloud APIとは
>Nature Remo Cloud API(以降API) を利用することで、Nature Remoシリーズ(以降Remo)のセンサーから得られる情報を取得する、Remoから赤外線を送信する、Natre Remo Eシリーズ（以降Remo E）に接続したスマートメーターから得られる電力データを取得するなどのアクションを行うことができる。

https://developer.nature.global/#%e3%81%af%e3%81%98%e3%82%81%e3%81%ab

## アクセストークンの発行方法
以下のページで、自分のアクセストークンを新規発行したり失効したりすることができます。

https://home.nature.global/


![スクリーンショット 2022-04-17 204715.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/f0f5c5d2-aab5-e1e3-b04e-0da00cf755ab.png)
**loginボタンをクリックしてください。**

![スクリーンショット 2022-04-17 205052.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/e38401ef-f2f0-c45c-41e6-9cb93ee72468.png)
![IMG_1909.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/ecbc18dd-8213-cbf8-fef1-b205959197b9.jpeg)
**Googleアカウント、またはメールアドレスでログインが可能です。**
**私は、スマートフォンのNature Remoアプリに登録されているメールアドレスでログインしました。**


![スクリーンショット 2022-04-17 211816.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/48a47913-f843-7bf6-152e-901ae2baab45.jpeg)
**入力したアドレスにログインメールが届きます。**
**メールのログインボタンを押してください**

![スクリーンショット 2022-04-17 214129.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/c7eaab15-4e69-1db8-8d53-d52324de974c.png)
**↓↓↓↓左下の「Generate access token」を押して↓↓↓↓**
![スクリーンショット 2022-04-17 213747.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/8b9f495c-7f2f-0a4c-f8b2-a35b0f1db4ba.png)
**発行されたアクセストークンをコピーしてください。後ほどこのトークンを使用します。**
**また、アクセストークンはこの後確認ができなくなります。**

:::note warn
注意
アクセストークンが知られると、他人に家の家電を操作されてしまいます。
公開することなく厳重に管理してください。
:::




以上でアクセストークンの発行は終了です。


# データ取得用Google Apps Script作成
1時間に一回、Nature Remo miniから室温データを取得し、スプレッドシートに書き込むスクリプトを作成します。
また、後々分析がしやすいように、データ取得時間を01:00:00や02:00:00などのきりがいい時間に設定しています。


## スプレッドシートの新規作成
![スクリーンショット 2022-04-18 093951.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/b3dfca1e-4aa3-c1c5-2a2c-14227730a97d.png)
**空白のスプレッドシートを新規作成します。**

![スクリーンショット 2022-04-23 001443.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/30f6fa33-4cae-6ffa-5a8f-338c92c83539.png)
**タイトルを分かりやすく「Nature Remo温度メモ」とします。**
**そして、1行目に列名を追加します。※自宅にはNature Rimo miniが2つあるので、それぞれの温度を記入する列を作成しました。**


## プログラムファイル作成
![スクリーンショット 2022-04-23 001443 - コピー.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/fff32eba-cffe-3ad5-4fcf-ce6d6e16d213.png)

**「拡張機能」タブからApps Scriptを選択します。**

![スクリーンショット 2022-04-18 221320.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/4e9d61d1-8562-d6ce-f5e8-0f376fbed058.png)
**デフォルトでソースコードが入力されています。**
**削除して、以下のソースコードを入力してください。**
**※Nature Rimo miniが1つの場合のソースコードもコメントアウトで記載しています。**


<details><summary><b>=======================<br>&nbsp;&nbsp;&nbsp;ソースコードを表示（折り畳み）<br>&nbsp;========================</b></summary><div>

```javascript:コード.gs
//===========================================================================================
// 毎時59分に実行するトリガーをセットする(例：14:30に実行したら14:59のトリガーをセット)
// この関数を1時間ごとのトリガーに指定して運用
//===========================================================================================
function setNextTrigger(){

  const time = new Date();
  time.setMinutes(59);

  //過去のトリガーを削除
  removeTrigger("mainTrigger");
  ScriptApp.newTrigger("mainTrigger").timeBased().at(time).create();

}


//===========================================================================================
// トリガーを削除
//===========================================================================================
function removeTrigger(triggerName){

  const triggers = ScriptApp.getProjectTriggers();

  for(const trigger of triggers){
    if(trigger.getHandlerFunction() == triggerName){
      ScriptApp.deleteTrigger(trigger);
    }
  }

}


//===========================================================================================
// 毎時59分に呼び出されるメイン処理のトリガー
//===========================================================================================
function mainTrigger(){

  //トリガーは毎時59分にセットされるため、00分00秒に処理を開始するまで待機
  const startTime = new Date();
  startTime.setMinutes(startTime.getMinutes() + 1);
  startTime.setSeconds(0);
  startTime.setMilliseconds(0);
  Utilities.sleep(startTime - new Date());

  main(); //メイン処理呼び出し

}


//===========================================================================================
// Nature Remo Cloud APIで、Nature RemoシリーズのセンサーからJSONデータを取得
//===========================================================================================
function getData() {

  //前工程で取得したアクセストークンを張り付けてください。
  var access_token = 'アクセストークン';

  var url = 'https://api.nature.global/1/devices';
  
  var params = {
    headers : {
      "Content-Type" : "application/json;",
      'Authorization': 'Bearer ' + access_token
    },
    method : 'get'
  };

  var data = JSON.parse(UrlFetchApp.fetch(url,params));

  return data;

}


//===========================================================================================
// スプレッドシートの最終行にデータを追加
//===========================================================================================
function setValue(data) {

  var ss = SpreadsheetApp.getActiveSpreadsheet()
  var sheet = ss.getActiveSheet()
  sheet.appendRow([new Date(), data[0]["newest_events"]["te"]["val"], data[1]["newest_events"]["te"]["val"]])

  //Nature Remoが1つで日時と温度（一か所）のみを記載する場合
  //sheet.appendRow([new Date(), data[0]["newest_events"]["te"]["val"]])
  
}


//===========================================================================================
// APIからデータを取得して、スプレッドシートへ書き込み
//===========================================================================================
function main(){

  var data = getData();

  setValue(data);

}
```

</div></details>

**↓↓↓↓貼り付ける！！↓↓↓↓**

![スクリーンショット 2022-04-18 221634.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/8c3fe167-b407-d92b-8aec-bcdfee91b860.png)
**貼り付けたら保存します。**

![スクリーンショット 2022-04-20 223222.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/c3e4a44d-420d-fca9-bbcc-e040487f105b.png)
**分かりやすさのためにプロジェクト名を変更します。**

## トリガー設定
![スクリーンショット 2022-04-20 223603.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/750e5b40-c744-c533-dc36-7d67308eb5cf.png)
**左の時計マークからトリガー設定へ移動する。**

![スクリーンショット 2022-04-20 222308.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/7bb92fa3-e569-0e34-c33a-5c0a4ba03b5e.png)
**画面遷移後、右下の「トリガーを追加」ボタンからトリガーを追加します。**

![スクリーンショット 2022-04-20 224244.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/d881dace-d064-e070-2e7e-6c25658d62c9.png)
**トリガーの設定を行い、保存します。**
* 実行する関数を選択
    * setNextTrigger
* 実行するデプロイを選択
    * Head
* イベントのソースを選択
    * 時間主導型
* 時間ベースのトリガーのタイプを選択
    * 時間ベースのタイマー
* 時間の間隔を選択（時間）
    * １時間おき
* エラー通知設定
    * 毎日通知を受け取る
        * こちらはお好みで変更してください。※1日で1回もエラーが起こらない場合は通知はきません。

![スクリーンショット 2022-04-20 234230.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/a9d0d301-7fa6-3729-69f6-476c2442e65b.png)
**何時間か放置してみるとこのようにデータが自動的に追加されていきます。**

以上でGoogle Apps Scriptの作成は終了です。


# Tableauで表示する

スプレッドシートのままでは傾向が分かりずらいため、おしゃれにまとめるためにTableauというBIツールを使用します。
Tableauとはビジュアル分析のプラットフォームであり、いくつかの製品から構成されています。
今回はその中でも「Tableau Public」という製品を使います。


## Tableau Publicとは
>インタラクティブなグラフ、美しいマップ、ライブダッシュボードを数分で作成できます。Viz を Tableau Public プロフィールに保存し、Web 上のどこでも共有できます。誰でも簡単に使えます。しかも無料です。

有料版の「Tableau Desktop」では様々なデータソースとの接続が可能ですが、今回はスプレッドシートと接続をするだけなので無料の「Tableau Public」を使います。
※ただし、作成したViz（Tableauで作成したビジュアライズされたグラフや表）はローカル環境に保存できないため、Tableau Publicプロフィールに保存する必要があります。

## Tableau Publicをインストールする

https://public.tableau.com/ja-jp/s/


![スクリーンショット 2022-04-22 234237.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/93a9678c-3470-8463-c76c-7053d4f6325e.png)
**リンク先の「PUBLICをダウンロード」ボタンを押してダウンロードしてください。**

![スクリーンショット 2022-04-22 234139.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/9d830ad7-7eb0-8748-3df3-7d2accc964fc.png)
**ダウンロードにはTableau製品全体で使用できるアカウントの作成が必要なので作成後してください。**
**※Tableau Publicで公開する際には公開される名前の変更が可能です。**

**ダウンロードが完了したら、手順に従ってインストールしてください。**

## データを接続する

![スクリーンショット 2022-04-23 000347.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/eb72ee61-d709-1499-ae82-20284632c14a.png)
**インストールしたTableau Publicを起動します。**
**トップ画面の接続先から「Google Drive」をクリックします。**

![スクリーンショット 2022-04-23 000933.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/47350560-336e-7693-3e2d-19f9a832e860.png)
**ブラウザでGoogleアカウントによる認証を行うと、Tableau Publicで上記のような画面が表示されます。**
**作成したスプレッドシート（今回は Nature Remo温度メモ）を選択します。**

![スクリーンショット 2022-04-23 002401.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/2c0b02f9-0942-c4a0-864f-b34a6223059a.png)
**データが接続され,、日時列は日付、室温データ列は数値として正しく認識されていることが確認できます。**

## ダッシュボードの作り方

作り方はファイルを実際に見てもらうのが早いかと思います。
リンク先のダウンロードボタンから 室温.twbx のダウンロードができます。

### twbxファイルのダウンロード方法

https://public.tableau.com/views/_16494711332630/sheet4?:language=ja-JP&:display_count=n&:origin=viz_share_link

![スクリーンショット 2022-04-23 004900.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/ee2f6efb-253e-c097-7608-8483694e8986.png)
**右上の赤枠のボタンを押してください。**

![スクリーンショット 2022-04-23 004942.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/45b47169-fbfc-8aac-4400-f45498ba5d69.png)
**Tableau ワークブックを選択してください。**

![スクリーンショット 2022-04-23 010123.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/acc16b4d-136f-d9a7-cced-ffef9f172f47.png)
**バージョンは「現在」で問題ないかとおもいますが、うまく見られない場合は「Tableau 2022.1」を選んでください。**

### ファイルの構成

![スクリーンショット 2022-04-23 010539.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/2c4caba9-27ff-afa3-8b2d-0331e724554e.png)
**構成は以下のようになっています。**

* データソース
* ワークシート
    * 時間室温 --1時間ごとの室温（生データ）
    * 日平均室温 --1日ごとの平均室温
    * 週平均室温 --1週間ごとの平均室温
    * 月平均室温 --1か月ごとの平均室温
* ダッシュボード
    * 室温 --ワークシートを1ページにまとめたもの

:::note warn
注意
このファイルはワークシートとダッシュボードの内容を確認するのみに使用するもので、データソースタブの内容を確認することはできません。
データソースタブを押すとGoogleの認証画面へ遷移しますが認証は**行わないでください。**
:::

### 追加したフィールドについて

生データは1時間ごとのデータなので、1日・1週間・1か月間の平均室温が知りたい場合は室温を足し合わせてからレコード数で割る必要があります。
今回は、リビングと寝室の平均室温を求める計算フィールドをを追加しています。

![スクリーンショット 2022-04-23 191525.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/23c7956e-b30c-501c-6888-2f3b59f8e23f.png)
![スクリーンショット 2022-04-23 191614.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/e4f940d4-1193-72fc-cfa5-1af106a5a2b1.png)
![スクリーンショット 2022-04-23 191814.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/e355c01d-04b5-0a6d-5572-fddbb0e1c0a1.png)

## パブリッシュする方法

Tableau Publicアプリケーションでファイルを保存しようとすると、自動的にTableau Publicへパブリッシュされます。
閲覧制限の機能はないため、扱うデータには注意してください。

## データの更新頻度

Tableau Publicでデータが自動的に更新される間隔は約24時間です。データをより早く更新させるには、保存したTableau Publicページの右下にある「データ更新の要求」ボタンを押してください。※作成者のみ実行できます。

![スクリーンショット 2022-04-24 221154.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/120247/aa0bd167-a285-1877-dead-0e09de26a33e.png)

以上でTableau Publicでの表示ができました。

#  完成

https://public.tableau.com/views/_16494711332630/sheet4?:language=ja-JP&:display_count=n&:origin=viz_share_link


# 参考

* プロジェクト関係

https://qiita.com/t-chi/items/01b9a9b98fbccef880c3

https://qiita.com/shobota/items/93f293f1cc2797d5a151

* 記事の書き方関係

https://qiita.com/miso_develop/items/10103e1b7719198f7cc5