教室に通っている学生さんに「断水って知ってる?」と問いかけたところ、
誰も知りませんでした。ゆゆしき事態です。
私が小さい頃は、何度か断水があったことを覚えています。
今年は台風によってある程度貯水率は回復しましたが、梅雨も明けまだすこし不安が
残ります。
私の友人にも、「貯水率が気になる」と何かに取り憑かれたかのように
つぶいやいている人物がおります。
ということでそんな彼のため「ダムの貯水率をメールで通知してくれるサービス」を
作成してみます。子供たちが作れるようにNode-Redを利用して作成していきます。
ブロックプログラミングの一種で、難しいコードはほとんど使いません!
是非夏休みの自由研究とか、節水意識の向上?に是非ご利用ください(笑)
Node-Redで最新の貯水率があなたのものに
サービス制作の大まかな手順
・ダムの貯水率の取得
・取得した情報をメールで送信
この手順のみです。
それでは作成していきましょう。
ダムの貯水率の情報をどこのサイトから取得するか
ダムの貯水率は沖縄県企業局の「ダム貯水率」の情報を通知します
https://www.eb.pref.okinawa.jp/kassui/
実際のデータは下記URLのcsvファイルから取得することが可能です。
https://www.eb.pref.okinawa.jp/js/chart/dam-youryou.csv
Node-Redでデータを取得する方法
Node-REDでWEBのデータを取得するにはhttp requestノードを利用します。
http requestのノードに取得したいデータのURLを記入します。
Node-Redで取得できるデータを確認してみる
http requestが完了したので動作を確認しましょう。
http requestを起動させるためにinjectノードが必要になるので左の「入力」から
injectをドラッグして作業スペースに移動しましょう。
injectが「timestamp」に自動的に変更されますが問題ありません。
次に出力からdebugノードを取り出します。
debugノードはNode-REDの右に配置されているデバッグ欄にmsgというデータの内容を表示
してくれます。3つのノードが配置できたら、それぞれのノードの端にある丸をドラッグして
つなげていきます。
これで確認する準備ができました。
それでは内容を確認してみましょう。
動作させる場合はinjectノード(timestamp)の左のダブをクリックします。
デバッグ欄にデータが表示されれば動作しています。
functionノードを使って貯水率のデータの加工する
データの取得ができたので、Node-Redのfunctionノードを利用して取得したデータを加工していきます。
functionノードはjavascriptでコードを書くことができます。
取得したデータは次のようなカンマ区切りのデータになっています。
1 2 3 4 5 |
06月26日,76525,4301,1149,81975 06月26日,105260,5900,1190,112350 06月26日,72.7,72.9,96.6,73.0 06月26日,81.8,89.3,92.8,82.5 06月26日,-9.1,-16.4,3.8,-9.5 |
1行目が本日の貯水量、2行目が満水量、3行目が本日の貯水量%、4行目が平均値%
5行目が平均値と本日の差になります。
このデータを加工するプログラムは次のようになります。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 |
//取得したデータを変数に格納 var data = msg.payload //取得したデータを改行で分割して配列化 var line_array = data.split("\n"); //変数の宣言 var today_ryo_array; //本日の貯水量 var max_array; //満水量 var ritsu_array; //本日の貯水量% var ave_array; //平均値% var diff_array; //差 //csvの行数文繰り返し処理を実施 for (i = 0; i < line_array.length; i++) { if (line_array[i].length !== 0) { //1行のカンマで区切られた項目を変数に格納 if (i === 0) msg.today_ryo_array = line_array[i].split(","); if (i === 1) msg.max_array = line_array[i].split(","); if (i === 2) msg.ritsu_array = line_array[i].split(","); if (i === 3) msg.ave_array = line_array[i].split(","); if (i === 4) msg.diff_array = line_array[i].split(","); } } //件名作成 msg.topic = msg.today_ryo_array[0] + "午前0時のダム情報"; //本文作成 msg.payload = msg.today_ryo_array[0] + "午前0時のダム情報\n"; msg.payload += "平年値の貯水率 :"+ msg.ave_array[4]+"%\n"; msg.payload += "本日午前0時の貯水率:"+ msg.ritsu_array[4]+"%\n"; msg.payload += "平年値との差 :"+ (parseFloat(msg.ritsu_array[4])-parseFloat(msg.ave_array[4]))+"%"; return msg; |
後述する、emailノードではmag.topicをメールの件名、msg.payloadをメールの本文とする決まりが
あるため、このような処理となります。
ここまでできたらノードを繋いでおきましょう
emailノードでメールを送信する
送信する情報の作成が完了したのでメールを送信します。
Node-REDのemailノードを利用することでメールを送信することが可能です。
gmailのアカウントがあればnode-REDからメールを送信することが可能ですので
gmailのアカウントがない方は取得しておいてください。
設定項目は次の通りです。
宛先 | メール送信先アドレス |
サーバ | smtp.gmail.com |
ポート | 465 |
ユーザID | gmailアカウントID |
パスワード | アプリパスワード* |
gmailのセキュリティ対策により、送信する際にアプリパスワードが必要となります。
アプリパスワードの作成方法
1.googleのアカウント画面に移動して「ログインとセキュリティを選択」
2.アプリパスワードを選択してアプリパスワードを設定してください。
※アプリパスワード上部の2段階認証が有効になっている必要があります。
メールの設定が完了したら、動作確認です。
emailのノードも繋げ終わったらinjectノード(timestamp)の左のタブをクリックしてみましょう。
こんな感じでメールが送信されてきます。
動作が確認できたらinjectノードの設定から繰り返し処理を追加します。
指定した日時、または間隔でメールを送付することができます。
注意事項:あまり短い時間間隔にしてしまうと沖縄県企業局、gmailに短時間に膨大なアクセスを
おこない、負荷がかかり、迷惑をかけてしまいます。
ダム情報の更新は1日1回となりますので、繰り返し間隔も1日以上の
期間を開けるようにしてください。
Node-Redでウェブから情報を自動取得し続ける~ダム貯水率編~ まとめ
いかがでしたか。
Node-Redで定期的に情報を通知する処理を作成する場合
・取得する情報のURLを「http request」ノードに指定する。
・取得した情報を「function」ノードで整形する。
・整形したデータを「email」ノードで送信する。
・「inject」ノードに繰り返しの設定をする
この4つの手順だけで定期的に決まった処理をするアプリケーションを作成することが可能です。
今回はダムの情報を利用しましたが、URLで取得可能な情報であれば貯水率以外でも活用できます。
天気予報のデータを取得して、毎日のお洗濯の参考にしてみたり、セール情報を掲載しているいくつかのサイトの情報をひとまとめにしてメールで送付できればもっと便利になりそうです。
自分が定期的に行なっているルーチンワークや定期的に確認したい情報があれば、ぜひNode-REDを活用して見てください!