どうもこじりょー(@kojiryoinvestor)です。
前回はArduinoとNode.jsでフルカラーLEDを発光させました。
今回は前回作った回路をそのまま利用し、現在の天気によってフルカラーLEDの色を変えるという「IoT」チックなことをやっていきます。
今回作成したコードはgitHubで公開しています。
無料で天気のAPIが取得できる「OpenWeatherMap」を利用する
アカウントを作成してAPIをテストする
天気によってフルカラーLEDの色を変えるため、天気の情報を取得する必要があります。
そこで利用するのが天気APIの「OpenWeatherMap」です。
無料と有料プラン両方ありますが、無料プランでも十分に使えます。
無料のFreeプランだと5日後までの3時間毎の天気予報を取得できて、1分間に60回までAPIコールできます。
月180ドルのDeveloperプランでは3000 calls/分までOKで、16日後までの天気予報を取得することができます。
利用には登録が必要なので無料のアカウントを作成していきます。
登録後にAPIキーを確認し、それを利用することでAPIリクエスト送ることができます。
試しに現在の天気を取得できる「http://api.openweathermap.org/data/2.5/weather」へリクエスト送ってみます。
APIをテストするにはPOSTMANがとても便利です。
パラメータAPPIDにはAPIキーを指定します。
パラメータidは、天気を知りたい市名のCityIDを指定します。
僕は東京都小金井市の天気が知りたいので小金井市のCityIDを指定しています。
CityID以外にも郵便番号等でもリクエストすることもできますが、OpenWeatherMapはcityIDでリクエストを送ることを推奨しているようです。
このように
q
パラメータで都市名を指定すると曖昧性があるので、OpenWeatherMapはcity IDというものでリクエストすることを推奨しています。
city IDの一覧は次のURLからダウンロードできます。city.list.json.gz
ですね。3.8MBあります。
リクエスに成功すると現在の天気の情報が取得できます。
次にこの流れをソースコードに落とし込んでいきます。
スポンサーリンク
現在の天気でLEDの色を変えるプログラムの作成
前回のフルカラーLEDを発光させたプログラムに追加・修正してコードを書きました。
こちらが現在の天気でLEDの色を変えるプログラムです。
モジュールの設定
現在の天気でLEDの色を変えるなら、定期的に「OpenWeatherMap」へリクエスを送る必要があります。
node.jsで定期的なタスクを実行するために、npmモジュールのnode-cronを利用しました。
cronは時間を指定してプログラムを実行するといったことができる便利なものです。
またnode.jsからリクエストを送るためにrequest-promiseを利用しています。
それぞれのモジュールをインストールして。
npm install node-cron
npm install request
npm install request-promise
require()で各モジュールを読み込むようにしておきます。
これで定期的にプログラムを実行する処理と、APIリクエストを送る処理を実装できるようになりました。
APIリクエスト送る・受け取る
OpenWeatherMapへリクエスト送るのに必要なもの定義しておきます。
URLとAPIキーとCityIDの値は変えないので定数として定義します。
これでどこからでもURLとAPIキーとCityIDを参照できるようになりました。
次にAPIリクエストを送る処理を実装していきます。
APIリクエストを送る処理は「function onLED()」内に書いています。
まず「var weatherJson」内にrequest-promiseを実行するために必要なパラメーターとオプションを定義しています。
あとはrequest-promiseを代入した「weatherJson」を実行すれば、OpenWeatherMapへリクエストを送り、データを受け取ることができます。
データを元にLEDの色を指定する
「http://api.openweathermap.org/data/2.5/weather」へリクエストを送ると、現在の天気を表すアイコン画像のファイル名も返ってきます。
Weather Conditions | OpenWeatherMap
今回は返ってきたデータの中にあるアイコン名から現在の天気を判定しています。
まずアイコン名から正規表現で数字のみを取り出します。
var iconName = json.weather[0].icon.replace(/[^0-9]/g,”);
その数字を「getColorCode()」という関数に渡します。
anode.color(getColorCode(iconName));
「getColorCode()」はアイコンのファイル名にある数字に適したカラーコードを返します。
01は晴れを示すアイコンなので現在の天気が晴れの場合は「赤色」に光るようにします。
02 – 04は曇りを示すアイコンなので、現在の天気が曇りの場合は「紫色」に光るようにします。
09 – 11は雨を示すアイコンなので、現在の天気が雨の場合は「水色」に光るようにします。
13は雪なので「白色」、50は霧なので「黄緑色」に光るようにしています。
「getColorCode()」で返ってきたカラーコードが「anode.color()」にセットされ、その色で発光します。
anode.color(getColorCode(iconName));
この部分がまさに、現在の天気に合わせたLEDの色を返す処理をしているコードです。
定期的にAPIをリクエストする
天気は常に変わるため、現在の天気を知るためには「OpenWeatherMap」へ定期的にリクエストを実行する必要があります。
そこでnode-cronを利用します。
「board.on()」という最初に実行される関数内にnode-cronを定義して、30分間隔で「onLed()」を実行するようにしています。
これで、「OpenWeatherMap」へ定期的にリクエストを送れるようになりました。
ターミナルで「node weather-led.js」を実行すれば現在の天気でLEDの色が変わります。
ただこれだけではターミナルを終了すると同時にプログラムも終了します。
そこでこのプログラムファイルをデーモン化します。
デーモン化するとプログラムが裏側でずっと動くようになります。
nodeモジュールのpm2を利用すれば簡単にプログラムをデーモン化できます。
下記のコマンドでpm2がインストールできます。
$ npm install pm2 -g
インストールが完了したら以下のコマンドでデーモン化できます。
$ pm2 start weather-led.js
これでターミナルを抜けてもweather-led.jsが動き続けます。
おわりに
以上が、現在の天気によってフルカラーLEDの色を変えるまでにやったことでした。
IoTチックになってぼくはそれなりに満足しています。
あとは見栄えとかもインテリアぽっく改善していきたいですね。
現状はA4のルーズリーフを丸めて被せているだけなので…。
下記の製品ぐらいに仕上げられたら最高ですね。
コメントを残す