RaspberryPi と GoogleCloudPlatform で家電をコントロール Vol.2

## ハードウェアが出来たので、ソフトウェア部分を作成していきます。

## リモコンの学習とhubotのインストール
操作したい家電のリモコンデータの学習と、hubotをインストールしてslackと接続していきます。
[こちら](https://qiita.com/takjg/items/e6b8af53421be54b62c9)を参考に作成しました。

ここまでで、スマートスピーカーから操作できるスマートリモコンが出来ましたので、これにGoogleCloudPlatformに連携してきます。

## GoogleCloudPlatform との連携

RaspberryPiで温度・湿度を測定し、測定結果をAPIで送信します。CloudFunctionsでこれを受信して、CloudSQLにデータを格納します。
この際に温度変化等からON/OFFを判断してRaspberryPiに結果を戻し、リモコン信号を発信させます。（今回は固定値を返しています。）
まずは、RaspberryPiからAPIで送信し、結果を受け取ってリモコン信号を発信する流れを作成していきます。

### 1. CloudSQLの準備

- インスタンスを作成していきます。
<img width="935" alt="スクリーンショット 2020-04-25 17.31.24.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/93a797d1-7bb2-caa0-01a7-160bc4268f78.png">

- MySQLを指定して、インスタンスID、パスワード等を指定していきます。
<img width="779" alt="スクリーンショット 2020-04-25 17.34.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/941c7422-1be2-04e2-e9c1-5509f2f15c70.png">

- とりあえずミニマムの構成で作成しました。
<img width="785" alt="スクリーンショット 2020-04-25 17.35.53.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/cca27bff-7519-78f6-1299-d317cc01b2a5.png">

- インスタンスの作成が出来たら、データベースを作成していきます。ここではroomDbという名前で作成しました。
<img width="785" alt="スクリーンショット 2020-04-25 17.39.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/75e8239d-32bb-616e-a0c8-cf77af37c445.png">

- 作成したデータベースに、測定したデータを格納するテーブルを作成します。

```
CREATE TABLE `roomData` (
  `recId` bigint(20) NOT NULL AUTO_INCREMENT,
  `temperature` decimal(5,2) DEFAULT NULL,
  `humidity` decimal(5,2) DEFAULT NULL,
  `pressure` decimal(7,2) DEFAULT NULL,
  `measurement_time` datetime DEFAULT CURRENT_TIMESTAMP,
  PRIMARY KEY (`recId`)
)
```
これでCloudSQLの準備は出来ました。


### ２. CloudFunctionsの準備
- APIを受けるCloudFunctionsで作成していきます。
<img width="764" alt="スクリーンショット 2020-04-25 18.03.17.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/35551d14-0e6b-c213-dd07-890b955f7e6f.png">

- 未認証の呼び出しを受けれるように作成していきます。
<img width="764" alt="スクリーンショット 2020-04-25 18.05.41.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/622279/365fff24-723a-14cf-16e6-3bcdd26d5419.png">

### 3. 受け取ったデータの格納と、レスポンスを返します。

- 先程作成したテーブルへのデータ格納と、レスポンスの返却部分を作成します。
レスポンスは固定内容を返すようにしています。

```
const mysql = require('mysql');

const connectionName = '＊＊＊＊＊＊＊＊:＊＊＊＊＊＊＊:room';
const dbUser = '＊＊＊＊＊';
const dbPassword = '＊＊＊＊＊';
const dbName = 'roomDb';

const mysqlConfig = {
  connectionLimit: 1,
  user: dbUser,
  password: dbPassword,
  database: dbName,
};

if (process.env.NODE_ENV === 'production') {
  mysqlConfig.socketPath = `/cloudsql/${connectionName}`;
}

let mysqlPool;

exports.main = (req, res) => {
  if (!mysqlPool) {
    mysqlPool = mysql.createPool(mysqlConfig);
  }

  const insertSQL = `INSERT INTO roomData (temperature, humidity, pressure) VALUES ('${req.body.temp}', '${req.body.hum}', '${req.body.pressure}')`;
  console.log(insertSQL);

  mysqlPool.query(insertSQL, (err, results) => {
    if (err) {
      console.error(err);
    }
  });

  res.status(200).send({'command':'airconon'});
}
```

- PACKAGE.JSON にMySQLを追加します。

```
  "dependencies": {
    "mysql": "2.18.1"
  }
```

これでGoogleCloudPlatform側の準備が出来たので、RaspberryPi側と繋いでいきます。

## RaspberryPi から測定結果を送信

スイッチサイエンスの[BME280のリポジトリ](https://github.com/SWITCHSCIENCE/BME280)からPythonのサンプルコードをダウンロードします。
このコードを流用して、APIの送信部分を追加します。
作成したCloudFunctionsのURLを指定して、測定結果を送信します。
APIから学習したコード名を返すようにしていますので、APIのレスポンスから取得してリモコン信号の送信用スクリプトに渡してあげます。

```
url = "https://********.cloudfunctions.net/********"
payload = {'temp': temperature, 'hum': var_h, 'pressure': pressure/100 }

res = requests.post(url, json=payload)
if res.status_code == requests.codes.ok:
    resJson = res.json()
    subprocess.call(["./bin/pi-send.sh", resJson["command"]])
else:
    print "api error!!"

```

これで、測定結果をGCPに送信し、そこから受け取ったレスポンスに応じてリモコン信号を発信することが出来ました。
次からは、レスポンスの作成部分を作っていきたいと思います。