RaspberryPi
IoT
mailgun
Raspberrypi3

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


レッツラズパイ!・プロジェクト


  1. レッツラズパイ!〜Raspberry3にOSをインストールしよう〜

  2. レッツラズパイ!〜Lチカ&Lピカをマスターしよう編〜

  3. レッツラズパイ!〜Webカメラで監視しちゃうゾ編〜

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

  5. レッツラズパイ!〜Google HomeでLピカさせよう編〜

  6. レッツラズパイ!〜Google Homeに室温を教えてもらおう編〜

  7. レッツラズパイ!〜Lチカボタン編〜

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


参考


温度センサーとmailgunで検知メールを送ろう


仕様と構成図


  • 温度センサーを取り付け、現在の温度をモニタリングできるようにする

  • 温度センサが27度以上を計測した時、スマホに「冷房つけろ」メールを飛ぶようにする

  • メールを飛ばす仕組みはmaigunを利用する


    • APIライクにメールを配信できるサービス



  • せっかくなのでLチカもさせて危機感を演出する

kousei2.png


必要なモノ


  • ブレッドボード×1個

  • 温度センサ (DS18B20)×1個

  • 抵抗器×2個

  • ジャンパーワイヤー(オス-メス)×5本

  • LED×1個


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


温度センサーの設定

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

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

配線2_aa.jpg

製品
接続するブレッドボードの場所
接続するラズパイの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

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回「ラズベリーパイで手作り温度計!」からお借りしました。)

$ 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のサンプルソースを使用して以下のスクリプトを作成します。


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ピカ編を参考)以下の配線図を参考にしてください。電源についてはせっかく前回の設定がありますので、「GPIO2」のピンにしてください。

配線2_bb.jpg

続いて、27度でLEDランプがチカチカするシェルスクリプトを作成します。以下のプログラムを作成してください。前提条件として、Lチカ&Lピカ編を完了していて、「lchika.sh」が完成していることとします。


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」を使ってメール通知を行います。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」を実行するようにします。


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で検知メールを送ろう編は以上です。お疲れ様でした♪