レッツラズパイ！〜温度センサーとmailgunで検知メールを送ろう編〜

## レッツラズパイ！・プロジェクト
1. [レッツラズパイ！〜Raspberry3にOSをインストールしよう〜](https://qiita.com/westvirginia/items/edc3b56da7be58419d70)  
[【番外編】レッツラズパイ！〜"ディスプレイなしで"RaspberryPiにOSをインストールしよう編〜](https://qiita.com/westvirginia/items/0d3b7d7dd19116cc14bf)
2. [レッツラズパイ！〜Lチカ＆Lピカをマスターしよう編〜](https://qiita.com/westvirginia/items/e339dbaf3286ea966483)
3. [レッツラズパイ！〜Webカメラで監視しちゃうゾ編〜](https://qiita.com/westvirginia/items/ba79f7549b43da116467)
4. レッツラズパイ！〜温度センサーで検知メールを送ろう編〜
5. [レッツラズパイ！〜Google HomeでLピカさせよう編〜](https://qiita.com/westvirginia/items/47437d547485cd2784ef)
6. [レッツラズパイ！〜Google Homeに室温を教えてもらおう編〜](https://qiita.com/westvirginia/private/f0842c034695665a78a6)
7. [レッツラズパイ！〜Lチカボタン編〜](https://qiita.com/westvirginia/private/7b33d27ce50d30895e13)

RaspberryPiを始めて触る＆IT初心者向けのドキュメントです。私の所属する会社で使う、IT初心者の方のインターンシップ向けのドキュメントとして書きはじめたので、かなり丁寧に書いていますがご了承下さい。

### 参考
- [第18回「ラズベリーパイで手作り温度計！」](http://deviceplus.jp/hobby/raspberrypi_entry_018/)(IT女子のラズベリーパイ入門奮闘記)

## 温度センサーとmailgunで検知メールを送ろう
### 仕様と構成図
- 温度センサーを取り付け、現在の温度をモニタリングできるようにする
- 温度センサが27度以上を計測した時、スマホに「冷房つけろ」メールを飛ぶようにする
- メールを飛ばす仕組みは[maigun](https://www.mailgun.com/)を利用する
    - APIライクにメールを配信できるサービス
- せっかくなのでLチカもさせて危機感を演出する

![kousei2.png](https://qiita-image-store.s3.amazonaws.com/0/164786/fe495898-7847-aa8a-8583-dcab81de639d.png)


## 必要なモノ
- ブレッドボード×1個
- 温度センサ (DS18B20)×1個
- 抵抗器×2個
- ジャンパーワイヤー（オス-メス）×5本
- LED×1個

## 温度センサーで室温をモニタリングする

### 温度センサーの設定
まずは、温度センサーを配線していきます。下図を参考に、RaspberryPiとブレッドボードに配線していきましょう。温度センサーはGPIO4でしか使えないっぽいので、そこに配線するようにします。

:warning:**温度センサーは配線を間違えると大変高温になります。やけどするので気をつけて下さい。**

![配線2_aa.jpg](https://qiita-image-store.s3.amazonaws.com/0/164786/57517ee5-5cc3-4de8-ec76-73f16a1790d5.jpeg)


|製品|接続するブレッドボードの場所|接続するラズパイのPIN|
|:---|:----|:-------|
|温度センサ|F14、F15、F16|-|
|抵抗|I15、I16|-|
|ジャンパワイヤー(青)|J14|20番ピン(GND)|
|ジャンパワイヤー(黒)|J15|7番ピン(GPIO4)|
|ジャンパワイヤー(白)|J16|17番ピン(3.3V)|

配線が完了したら、次に「1-Wire」を有効にします。

今回使用する「DS18B20」という温度センサは、1-Wire（接地線と一本の信号線兼電力供給線だけで低速なデータ転送を行うバス規格）というインターフェースを使用した部品です。ラズベリーパイには1-Wire用のモジュールがあらかじめインストールされているので、設定を有効にするだけですぐに使用できます。

GUIの左上のスタートメニュー→[設定]→[Raspberry Piの設定]をクリックします。[インターフェイス]タブを選択し、「1-Wire」の値を「有効」にし、OKを押します。その後再起動を求められるので再起動をします。

![IMG_3340.jpg](https://qiita-image-store.s3.amazonaws.com/0/164786/d19919b0-3bc2-63b3-978f-179415ac82a6.jpeg)

1-Wireが有効化され、温度センサの認識に成功すると、/sys/bus/w1/devicesにファイルが生成されます。実際に確認してみましょう。下記コマンドで温度センサーのデバイスIDを確認します。

```
$ ls /sys/bus/w1/devices
```

「28-000006470bec」のような文字列のディレクトリが作成されているかと思います。これがデバイスIDです。デバイスIDは今後必要になってくるので、メモしておきましょう。

次に、温度が出力されるファイルの中身を確認をします。温度が正常に出力されているか確認してください。
(device_id)には、先ほどメモしたデバイスIDを入力して下さい。

```
$ cat /sys/bus/w1/devices/(device_id)/w1_slave
```

### 室温をグラフでモニタリング

これから、温度センサーが感知した値をGoogleChartを使ってブラウザ上に表示させ、モニタリングできるようにします。表示させるには、RaspberryPiにWebサーバの機能が必要になるため、ApacheとPHPをインストールします。

```
$ sudo apt-get install apache2 php
```

インストールが完了したら、温度データの取得・保存を行うプログラムを作成します。deviceIdを先ほど確認したデバイスIDの値に変更し、プログラムを作成して下さい。
（コードは、[第18回「ラズベリーパイで手作り温度計！」](http://deviceplus.jp/hobby/raspberrypi_entry_018/)からお借りしました。）


```
$ sudo vim /var/www/temperature.php

<?php
//deviceIdは、先ほど確認したデバイスIDの値を入力
$deviceId = 'deviceId';
$today = date("Ymd");
$time = date("H:i");
$sensor_path = '/sys/bus/w1/devices/'.$deviceId.'/w1_slave';
$csv_dir = '/var/www/temperature/';
$csv_file = $today.'.csv';
$t = null;
//温度取得
exec("cat ".$sensor_path, $w1_slave);
if(isset($w1_slave[1])){
$tmp = explode('t=', $w1_slave[1]);
if(isset($tmp[1])) $t = $tmp[1] / 1000;
}
//CSV書き込み
if(!file_exists($csv_dir)){
mkdir($csv_dir);
}
if( $handle = fopen( $csv_dir.$csv_file , 'a' ) ){
fputcsv( $handle, Array("'".$time."'", $t) );
fclose($handle);
}
return;
```

時間を指定して温度を自動で感知する設定をします。今回は「1分単位」に観測するよう、crontabで設定します。

```
$ sudo crontab -e
* * * * * php /var/www/temperature.php 
```

GoogleChartのサンプルソースを使用して以下のスクリプトを作成します。

```php:index.php
$ sudo vim /var/www/html/index.php

<?php
$today  = date("Ymd");
$csv_dir  = '/var/www/temperature/';
$csv_file = $today.'.csv';
$grapgh   = '';
 
//CSV読み込み
if (($handle = fopen($csv_dir.$csv_file, "r")) !== false) {
    while (($line = fgets($handle)) !== false) {
     $grapgh .= '['.rtrim($line).'],'.PHP_EOL;
    }
    fclose($handle);
}else{
    echo 'no data';
}
?>
<html>
<head>
  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
  <script type="text/javascript">
    google.load('visualization', '1.1', {packages: ['line']});
    google.setOnLoadCallback(drawChart);
 
    function drawChart() {
    var data = new google.visualization.DataTable();
    data.addColumn('string', 'Time');
    data.addColumn('number');
    data.addRows([
 
<?php echo $grapgh; ?>
 
    ]);
 
    var options = {
        chart: {
        title: 'Raspberry Pi Thermometer',
        },
        height: '500'
    };

var formatter = new google.visualization.NumberFormat(
    {fractionDigits: 3}
    );
    formatter.format(data, 1);

    var chart = new google.charts.Line(document.getElementById('linechart_material'));
    chart.draw(data, options);
    }
  </script>
</head>
<body>
  <div id="linechart_material"></div>
</body>
</html>
```

スクリプトが正常に動作していれば、以下のURLより温度グラフが表示されます。

```
http://RaspberryPiのIPアドレス/index.php/
```

グラフが表示されていれば成功です。

## 室温27度以上でメールを送る仕組みをつくる
27度になった時のトリガーの仕組みさえできれば、後はそれを応用してLチカさせたり、メールを送ったりすることが可能です。

### 27度以上になったらLチカさせる
LEDランプの配線をします。（[Lチカ＆Lピカ編](https://qiita.com/westvirginia/items/e339dbaf3286ea966483)を参考）以下の配線図を参考にしてください。電源についてはせっかく前回の設定がありますので、「GPIO2」のピンにしてください。

![配線2_bb.jpg](https://qiita-image-store.s3.amazonaws.com/0/164786/40311986-7184-6cee-02d6-dae7024d1152.jpeg)


続いて、27度でLEDランプがチカチカするシェルスクリプトを作成します。以下のプログラムを作成してください。前提条件として、[Lチカ＆Lピカ編](https://qiita.com/westvirginia/items/e339dbaf3286ea966483)を完了していて、「lchika.sh」が完成していることとします。

```bash:temperature.sh
$ vim $HOME/work/temperature.sh

#!/bin/sh
today=$(date "+%Y%m%d")
ondo=`tail -n 1 /var/www/temperature/${today}.csv | cut -d , -f 2 | cut -b 1,2`

if [ $ondo -ge 26 ] ; then
. $HOME/work/lchika.sh
echo "温度は27以上です"
else
echo "温度は27以下です"
fi
```

それではさっそく作ったシェルを実行しましょう。成功すると、「温度は27以上です」または「温度は27以下です」とターミナルに表示されます。「温度は27以上です」と表示された場合は、Lチカもしますので確認しましょう。もし27度以下であれば、自分の手で温度センサーの周りを囲み手動で温度を上げてみてください。

以上で、27度以上になったらLチカさせる設定は終了です。

### メール通知の設定を追加しよう
今回は「[Mailgun](https://www.mailgun.com/)」を使ってメール通知を行います。Mailgunは、APIベースのメール配信サービスです。無料でも機能限定で使用できます。Bashだけでなく、もPython、Ruby、PHPなど様々な言語で使うことができます。

まずは、Mailgunのアカウントを作成してください。アクセスして「Try Mailgun Now」をクリックして進めれば、簡単に登録ができます。

以下のようなプログラムがアカウント作成後に表示されますので、保存しておいて下さい。

例）

```
curl -s --user 'api:key-***********************************' \
    https://api.mailgun.net/v3/sandboxsampledomain.mailgun.org/messages \
    -F from='Excited User <mailgun@sandboxsampledomain.mailgun.org>' \
    -F to=mymail@example.com \
    -F subject='Hello' \
    -F text='Testing some Mailgun awesomness!'
```

先ほどのcurlコマンドを、シェルとしてファイル化しておきます。メッセージも少し変えておきましょう。

```
$ vim $HOME/work/mail.sh

#!/bin/sh
curl -s --user 'api:key-***********************************' \
    https://api.mailgun.net/v3/sandboxsampledomain.mailgun.org/messages \
    -F from='Excited User <mailgun@sandboxsampledomain.mailgun.org>' \
    -F to=mymail@example.com \
    -F subject='暑すぎます' \
    -F text='クーラーつけてよ〜（泣）'
```

「temperature.sh」を編集し、27度以上の時に「mail.sh」を実行するようにします。

```bash:temperature.sh
$ vim $HOME/work/temperature.sh

#!/bin/sh
today=$(date "+%Y%m%d")
ondo=`tail -n 1 /var/www/temperature/${today}.csv | cut -d , -f 2 | cut -b 1,2`

if [ $ondo -ge 26 ] ; then
. $HOME/work/lchika.sh
echo "温度は27以上です"
. $HOME/work/mail.sh
else
echo "温度は27以下です"
fi
```

これで準備は完了です。温度センサーが27度以上の時に、temperature.shを実行してみましょう。LEDランプがピカピカとひかり、あなたのメールアドレスに検知メールが飛んだはずです。

温度センサーとmailgunで検知メールを送ろう編は以上です。お疲れ様でした♪