RaspberryPi3を使ってLINE BOTに部屋の温度を教えてもらう【node.js】 

### 要件
外出時、LINEで部屋の温度が知りたい
→ node.jsを使ってラズパイから部屋の温度を取得し、LINEBotで返信する

### 前提条件

+ LINE BOTが使えるようになっていること
+ ラズパイが初期設定済
+ ngrokが使えるようになっていること

上記は前回参照
[Node.jsで LINE BOT作ってみる のメモ【1時間でできる！】](https://qiita.com/mochifuture/items/bab1c233e6768d571098)


# 今回の作業概要
1. ラズパイに最新版のnodeとnpmをインストールする
2. 温湿度センサー DHT11をnode.jsで使えるようにする
3. 温湿度を聞く（Botで返信）

所要時間　うまくいけば2時間

# 1.ラズパイに最新版のnodeとnpmをインストールする
最新バージョンの RASBIAN には nodejs が収容されているが，現行のものと比べてかなり古いバージョンなのでアンインストールし新しいバージョンをインストールします
参照記事
https://make.kosakalab.com/make/electronic-work/nodejs_raspi/


# 2.温湿度センサーをnode.jsを使って使えるようにする

センサー・DHT11の接続（ラズパイをシャットダウンし、電源を切ってから配線しましょう！）
![How-to-Setup-the-DHT11-on-the-Raspberry-Pi-Four-pin-DHT11-Wiring-Diagram.png](https://qiita-image-store.s3.amazonaws.com/0/258078/f8722b54-8b1f-848e-4d18-34d419598263.png)
参照　http://www.circuitbasics.com/how-to-set-up-the-dht11-humidity-sensor-on-the-raspberry-pi/

![IMG_E7024.JPG](https://qiita-image-store.s3.amazonaws.com/0/258078/9e03d820-7795-80db-6f42-1e200c48a358.jpeg)



ラズパイの起動

ディレクトリ構成の確認
```/mylinebot
server.js     node_modules      package-lock.json package.json```


今回はnode.jsを利用するので
node-dht-sensorというライブラリをインストールしよう！

## bcm2835をraspbianにインストールする
bcm2835というライブラリが必要（依存ライブラリ）
http://www.airspayce.com/mikem/bcm2835/

ディレクトリ構成はこうなる予定
```/mylinebot
server.js     dht.js   plugins    node_modules      package-lock.json package.json
```

ディレクトリ作成
`$ mkdir plugins`
`$ cd plugins`

下記のコマンドを実行
```$ wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.55.tar.gz
$ tar zxvf bcm2835-1.55.tar.gz 
$ cd bcm2835-1.55/
$ ./configure
$ make
$ sudo make check
$ sudo make install
```

sudo make checkを実行した際に画面に「# PASS:  1」と表示されれば、bcmのインストールは正常に完了

うまくいかない時は
参照記事
https://github.com/bpmurray/node-red-contrib-dht-sensor/issues/13
https://www.niandc.co.jp/sol/tech/date20160513_545.php

## 本命・node-dht-sensorのインストール
https://github.com/momenso/node-dht-sensor

`$ sudo npm install —save-dev node-dht-sensor --dht_verbose=true --unsafe-perm`

node-gypを使って、ダウンロードしたnode-dht-sensorをビルド

```$ sudo npm install node-gyp -g
$ cd ~/workspace/mylinebot/node_modules/node-dht-sensor
$ sudo node-gyp configure
$ sudo node-gyp build
```

「node-gyp configure」・「node-gyp build」を実行した際に「gyp info ok」と表示されれば正常に完了

## プログラムを作成

dht.jsを作成
`$ touch dht.js`

まずはconsole.logで確認するプログラム

```js:dht.js
var sensor = require('node-dht-sensor');

sensor.read(11, 4, function(err, temperature, humidity) {
    if (!err) {
        console.log('temp: ' + temperature.toFixed(1) + '°C, ' +
        'humidity: ' + humidity.toFixed(1) + '%'
        );
    }
});
```

nodeで起動し確認
`$ node dht.js`
temp: 21.0°C, humidity: 41.0%

取得できた！(ﾟ∀ﾟ)


# 3.温湿度を聞く（LINE Botで返信）

## dht.jsの編集

```js:dht.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 ‘不明です’;
    }   
}
```

## server.jsの編集

以下を追加

```js:server.js
const dht = require(‘./dht’);


if(event.message.text === 'いまなんど') {
    mes = dht.getData();
} else {
    mes = event.message.text;
}
```

サーバーを起動しngrokでトンネリング。WebHook URLを編集→この辺は前回参照
「いまなんど」と聞いたら返事が来ますよ！ヽ(*・∀・*)ﾉ

おつかれさまでした！ヽ(*・∀・*)ﾉ


参照させていただいた記事
https://qiita.com/kohbis/items/feeb91727e1bcbd4f092

次回はPush API！
LINE BOTでラズパイから温度を通知【Push API】【Node.js】