連載
» 2014年08月01日 18時00分 公開

Arduinoで始めるWeb技術者のためのIoT入門(3):夏休みの子どもの自由研究に最適! 植物からメールをもらおう (3/3)

[岩永義弘,株式会社インターネットイニシアティブ]
前のページへ 1|2|3       

メールを送信するプログラムを実装

 続いて、メールを送信するプログラムを実装していきましょう。「mailgun-js」というモジュールをベースに、ラッパーモジュールを作ります。下記コマンドを実行してmailgun-jsをインストールしておきます。

npm install mailgun-js

 コード「mailer.js」は次のようになります。

var Mailgun = require('mailgun-js');
 
function Mailer(conf){
    this.mailgunConf = {
        apiKey : conf.apiKey,
        domain : conf.domain
    };
    this.mailData = {
        from       : conf.from,
        to         : conf.to,
        subject    : conf.subject,
        ok_message : conf.ok_message,
        ng_message : conf.ng_message
    };
 
    this.mailer = new Mailgun(this.mailgunConf).messages();
}
 
Mailer.prototype.send = function (message) {
    this.mailData.text = message;
    this.mailer.send(this.mailData, function(err, body){
        if (err) {
            console.log(err);
        }
        console.log(body);
    });
};
 
Mailer.prototype.notifyOK = function() {
    this.send(this.mailData.ok_message);
};
 
Mailer.prototype.notifyNG = function() {
    this.send(this.mailData.ng_message);
};
 
module.exports = Mailer;
mailer.js

 先ほど得たAPI Keyやメールの宛先、本文をコンストラクターに渡します。OKに遷移したときはnotifyOK()メソッドを、NGに遷移したときはnotifyNG()メソッドを呼び、メールを送信します。

 このように、前回説明したFirmataプロトコルを使って外部から制御するアプローチを取ったことで、ネットワーク越しの連携を非常に簡単に実現できました。これで必要なパーツが全て出そろいました。残すは、これらのプログラムを結合させて、起動するだけです。

いよいよ完成! メインプログラムを実装&実行

 「センサー値の読み出し」「状態管理」「メール通知」のプログラムを結合して、システムを完成させましょう。「lib」というディレクトリを作成し、その下に先ほどの「stateMachine.js」「mailer.js」を配置します。

メインプログラムの実装

 メインプログラムは次のようになります。コード中のXXXは適宜MailGun登録時に確認した値で読み替えてください。

var j5           = require('johnny-five'),
    arduino      = new j5.Board(),
    Mailer       = require('./lib/mailer'),
    StateMachine = require('./lib/stateMachine');
 
var MailConf = {
    apiKey     : 'key-XXX',
    domain     : 'sandboxXXX.mailgun.org',
    from       : 'XXX@sandboxXXX.mailgun.org',
    to         : 'XXX@XXX',
    ok_message : 'ありがとう(`・ω・´)シャキーン',
    ng_message : '土が乾いたよ(´・ω・`)\n' +
                 'お水ちょーだい'
};
 
var mailer       = new Mailer(MailConf);
var stateMachine = new StateMachine({
    threshold       : 100,
    thresholdMargin : 50
});
 
arduino.on('ready', function(){
    var sensor       = new j5.Sensor({
        pin : 'A0',
        freq: 1000
    });
 
    sensor.on('data', function(){
        var transitionedTo = stateMachine.determineTransition(this.raw);
        if (transitionedTo === 'OK') {
            mailer.notifyOK();
        } else if (transitionedTo === 'NG') {
            mailer.notifyNG();
        }
    });
});

 最初に紹介したコードから変更したのは次の点です。

  • 3〜4行目:モジュール読み込み
  • 6〜14行目:メールの設定。10行目のtoで通知メールの送信先を指定
  • 16〜20行目:設定を指定してインスタンス化
  • 29〜34行目:センサー値を基に状態を判断。状態が遷移したらメールを送信。


foreverでプログラムを手っ取り早くdaemon化して実行

 さて、プログラムを起動しましょう。このプログラムをdaemon化するためには、他の言語と同じようにforkする処理を追加するのが正攻法ですが、手っ取り早く実現するために「forever」というCLIツールを利用します。

 foreverは下記コマンドでインストールします。

npm install forever -g

 下記コマンドでmain.jsを起動します。

forever start main.js

 では、センサーを水に出し入れして、動作を確認してみましょう。水から出したときと水に入れたときとで違う文面のメールが届くことでしょう。

 これで、あなたもIoTメーカーです!

Raspberry Pi上で動かせばPCみたいに場所をとらない

 今回は、センサーとメールを連携させ、不要な通知を抑制する工夫を加えました。Firmataプロトコルを使うことで、JavaScriptでロジックやメール送信処理を記述でき、非常に短いコード量でIoTを実現しました。

 実用する際は、このプログラムをRaspberry Pi上で実行することで、コンパクトかつ安価にシステムを構築できます。

PCをRaspberry Pi(一番右)に置き換えたところ

 以上、いかがでしたでしょうか。本記事が皆さんのアイデアの種となれば、そしてお子さんの夏休みの自由研究に役立てば幸いです。

次回は、スマホからArduinoを経由して、家電を操作

 次回は、スマホからArduinoを経由して、家電(エアコンやコーヒーメーカーなど)を操作する方法を紹介する予定です。お楽しみに!

著者プロフィール

岩永 義弘(いわなが よしひろ)

株式会社インターネットイニシアティブ

データ分析とワインが好物。通信アノマリ検知システムや地震速報配信システムの開発と運用を経た後、Webアプリのフロントエンドに手を伸ばし、図らずもフルスタックな道を突き進んでいる。最近は趣味でHTTP/2の実装を楽しんでいる。

Twitter:@y_iwanaga_

Bot:@quake_alert @WeatherAlertJP


前のページへ 1|2|3       

Copyright © ITmedia, Inc. All Rights Reserved.

編集部からのお知らせ

8月8日10時30分〜16時30分の間、システムメンテナンスのため記事の一部表示や資料のダウンロードができなくなります。ご理解のほどよろしくお願いいたします。

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。