続いて、メールを送信するプログラムを実装していきましょう。「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;
先ほど得た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(); } }); });
最初に紹介したコードから変更したのは次の点です。
さて、プログラムを起動しましょう。このプログラムをdaemon化するためには、他の言語と同じようにforkする処理を追加するのが正攻法ですが、手っ取り早く実現するために「forever」というCLIツールを利用します。
foreverは下記コマンドでインストールします。
npm install forever -g
下記コマンドでmain.jsを起動します。
forever start main.js
では、センサーを水に出し入れして、動作を確認してみましょう。水から出したときと水に入れたときとで違う文面のメールが届くことでしょう。
これで、あなたもIoTメーカーです!
今回は、センサーとメールを連携させ、不要な通知を抑制する工夫を加えました。Firmataプロトコルを使うことで、JavaScriptでロジックやメール送信処理を記述でき、非常に短いコード量でIoTを実現しました。
実用する際は、このプログラムをRaspberry Pi上で実行することで、コンパクトかつ安価にシステムを構築できます。
以上、いかがでしたでしょうか。本記事が皆さんのアイデアの種となれば、そしてお子さんの夏休みの自由研究に役立てば幸いです。
次回は、スマホからArduinoを経由して、家電(エアコンやコーヒーメーカーなど)を操作する方法を紹介する予定です。お楽しみに!
岩永 義弘(いわなが よしひろ)
株式会社インターネットイニシアティブ
データ分析とワインが好物。通信アノマリ検知システムや地震速報配信システムの開発と運用を経た後、Webアプリのフロントエンドに手を伸ばし、図らずもフルスタックな道を突き進んでいる。最近は趣味でHTTP/2の実装を楽しんでいる。
Twitter:@y_iwanaga_
Bot:@quake_alert @WeatherAlertJP
Copyright © ITmedia, Inc. All Rights Reserved.