LINEでラズパイさんから家の温度を教えてもらう

## 経緯
※この資料は、社内発表用に作成したものです。

* [Node学園祭2017](http://nodefest.jp/2017/)に行ってきた。
* LINE BOT 作った。
[1時間でLINE BOTを作るハンズオン (資料+レポート) in Node学園祭2017 #nodefest](https://qiita.com/n0bisuke/items/ceaa09ef8898bee8369d)

* RaspberryPi と組み合わせて色々できそうな気がした。

---

## そんな気がしたので<br>やってみた。

---

## 今回 RaspberryPiでやりたいこと
* Node.js & センサーモジュールで室温しらべる。

---

## 環境
* Raspbian GNU/Linux 8.0 (jessie)
* 温度湿度センサー DHT11

---

## 準備
前出のハンズオン資料に従って準備。
### RaspberryPi側に導入するもの
* OSインストールとかSSH設定とかは割愛。
* [Node.js](https://nodejs.org/)（今回は v9.2.0）
* [npm](https://www.npmjs.com/)（今回は 5.5.1）
* [ngrok](https://ngrok.com/)（RaspberryPiで立ち上げたサーバにアクセスする）

### その他の準備
* [LINE](https://developers.line.me)のプロバイダー登録&ボット作成

---

## RaspberryPiでサーバ起動＆アクセス
1. `node server.js`（ソースは後述）
2. `ngrok http ポート番号`（1. のポートを指定）
3. LINEのWebhookURLに 2. のURLを設定する。

---

## おうむ返し
メッセージをそのまま返してくれる。
<img width="375" alt="IMG_2521.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123634/b479220f-86c7-e7ad-0159-dc29622ec4da.png">
▼ほぼ[公式ドキュメント](https://line.github.io/line-bot-sdk-nodejs/)のまま

```javascript:server.js
'use strict';

const express = require('express');
const line = require('@line/bot-sdk');

const PORT = process.env.PORT || 3000;

const config = {
    channelAccessToken: 'CHANNEL_ACCESS_TOKEN',
    channelSecret: 'CHANNEL_SECRET'
};

const app = express();

app.post('/webhook', line.middleware(config), (req, res) => {
    console.log(req.body.events);
    Promise
      .all(req.body.events.map(handleEvent))
      .then((result) => res.json(result));
});

const client = new line.Client(config);

function handleEvent(event) {
    if (event.type !== 'message' || event.message.type !== 'text') {
        return Promise.resolve(null);
    } 

    let mes = '';
    mes = event.message.text;
    
    return client.replyMessage(event.replyToken, {
        type: 'text',
        text: mes
    });
}

app.listen(PORT);
console.log(`Server running at ${PORT}`);

```

---

##　キーワードごとに処理を分ける

「いまなんじ」で時間を教えてもらう。
<img width="375" alt="IMG_2523.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123634/b2184014-4aa3-c68c-bf79-7c1d2440f7cc.png">

```javascript:server.js
const moment = require('moment-timezone');

省略

if(event.message.text === 'いまなんじ') {
    mes = '現在の時刻は'+moment().tz("Asia/Tokyo").format('HH時mm分ss秒')+'です';
} else {
    mes = event.message.text;
}
```


---

## 本題<br>温度を問い合わせる

---

## センサー接続

こんな感じ
<img width="500" alt="PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123634/183eb46d-8126-31c3-0412-bd456a60d5bd.png">
配線は、次のスライド記載のライブラリのREADMEから。

---

## センサーからデータ取得

[node-dht-sensor](https://github.com/momenso/node-dht-sensor)というライブラリを使用。

```javascript:raspi.js
const sensorLib = require('node-dht-sensor');

const sensor = {
    sensors: [ {
        name: "DHT11",
        type: 11,
        pin: 4
    } ],
    read: function() {
        const readout = sensorLib.read(this.sensors[0].type, this.sensors[0].pin);
        return '室内の温度は'+readout.temperature.toFixed(1)+'℃、'+'湿度は'+readout.humidity.toFixed(1)+'%です。';
    }
}

exports.getData = function() {
    try {
        return sensor.read();
    } catch (error) {
        return 'わかんない';
    }   
}
```
```javascript:server.js
const raspi = require('./raspi');

省略

if(event.message.text === 'いまなんじ') {
    mes = '現在の時刻は'+moment().tz("Asia/Tokyo").format('HH時mm分ss秒')+'です';
} else if(event.message.text === 'いまなんど') {
    mes = raspi.getData();
} else {
    mes = event.message.text;
}
```

---

## いざ「いまなんど」

---

## きた

<img width="375" alt="IMG_2524.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123634/16f331d4-a23a-f99c-0761-309dccbf1bc4.png">

---

## にぎってみる

<img width="500" alt="PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123634/1d49d1fa-eca9-1188-097b-6cda30b46789.png">

---

## ちょっと上がった

<img width="375" alt="IMG_2525.PNG" src="https://qiita-image-store.s3.amazonaws.com/0/123634/b42217c9-d131-7e22-f76a-cde74e059518.png">

---

## まとめとか
* Node.js × LINE × IoT 良さげ。
* ngrok便利。RaspberryPiのアクセス超簡単。
* 次はエアコンつける機能もつけたい。
* Node学園祭楽しかった。

---

## おわり。