これはNode-RED Advent Calendar 2020の17日目のエントリーとなります。
毎年この頃になるとアドベントカレンダーのことを意識しながらエントリーを書いているのですが、 今年は仕事のほうが忙しく、ネタ探しがうまくいっていませんでした。
とはいえ、申し込んだときには色々少しは余裕があるかなと思っていたのですが、なかなかうまく行かず。
そこで今年は少し興味が湧いたNode-RED
で使用できるスケジューラー(タイマー)機能のノードを調べてみることにしました。Node-RED
で
インターバルタイマーを使うことはあっても、schedulerのようなノードを使うことはあまりありませんでした。センサーでの計測を行うときには
計測するタイミングは定時的なスケジュールで動かすこともあるので、今回はそんなスケジュールで動作するいくつかのノードの使い方を調べてみようと思います。
動作にあたって念の為にNode-REDをバージョンアップ
環境が少し古かったので最新のバージョンに更新しておきます。Node-RED
を一旦終了してから以下のコマンドを実行してNode-RED
を最新バージョンにアップしておきます。
$ sudo npm install -g --unsafe-perm node-red
実行すると以下のように表示が行われます。
問題なくバージョンアップが行われたらNode-RED
を起動して、フローエディタからバージョンを確認すると、現在の最新バージョンの1.2.6になっていることが確認できます。
では、スケジュール機能のあるノードをインストールしていきます。
試してみるスケジュール機能を持つノード
今回、使い方を調べようと思った拡張ノードはSchedule
のキーワード検索するとかなりの数出てくるのですが、
その中でもダウンロード数が多かったものを2つ調べてみることにします。
実際に調べてみたものは以下の2種類のものになります。
●node-red-contrib-bigtimer flows.nodered.org
●node-red-contrib-schedex flows.nodered.org
ちなみに拡張ノードのインストール方法
拡張ノードのインストールに関してはご存知かもしれませんが、念の為に。
画面右上にある【三】ボタンをクリックしてメニューの中から【パレットの管理】をクリックして選択を行います。
ユーザ設定の画面が開くので、更に【ノードを追加】タブをクリックします。
追加するノードを検索する画面になるので、入力ボックスに拡張ノードの名前を入力し検索を行います。
該当するノードが見つかったら【ノードを追加】ボタンをクリックします。
インストール確認のダイアログが表示されたら【追加】ボタンをクリックします。これでインストールが開始されます。
インストール中は画面が以下の様になっています。必要があれば【ログを確認】ボタンで状況を確認するのもいいかと思います。
処理が成功すると以下のように表示が行われます。
ボタンの表示も【追加しました】に変更されているので、確認した後【閉じる】ボタンをクリックします。
これで拡張ノードのインストールができます。以下のノードも同様に追加作業を行ってください。
拡張ノードnode-red-contrib-bigtimer
を使用する
拡張ノードnode-red-contrib-bigtimer
がダウンロード数が一番大きなスケジュール機能を持ったタイマーのようです。
インストール後はパレットのその他
のカテゴリーに配置されます。
説明としては、特別な日などの機能を備えた究極のNode-REDタイマーということのようです。 設定値としては、月、日、手動オーバーライド、時停止、ランダム値、特別な日の設定、時刻のオフセット指定が可能です。その他に夕暮れ、夜明けのようなバリエーション指定(その他にも日の出、日の入り、月の出、月の出、月の入り)特徴もあります。STOPを使用すると、出力をOFFに設定することもできます。
非常に沢山のパラメーターを設定することができますが、単純なタイマーをしても使用することができます。どちらかといえばLinuxにあるcron
サービス+タイマーの便利機能といった表現がいいかもしれません。
設定値のプロパティは以下の様なものが設定できますが、これでも一部といった状況です。
ON/OFFのタイマーは2つ存在していて、それぞれで設定を行うことができます。時刻の設定は15分単位でしか設定できないのですが、ON/OFFのOFFSET値を設定することで1分単位での設定を行うことができます(タイマーの2つにそれぞれONとOFFにのOFFSETを設定可能)。ON TIMEが22:15
であったときに、ON OFFSETを1
と設定すれば、ONの時刻は22:16
に設定することができます。
またONのトリガー時には文字列出力ができるとともに、MQTT
でのデータ送信も可能になっています。
cron
のように曜日設定や日付設定も可能ですし、逆にキャンセル日の指定も可能です。
簡単なBigTimerノード作成としては以下のようになると思います。
最初のinjectノード
はタイマー処理の入力用データを与える役割になります。これがなくてもフローをデプロイすればタイマーは自体は起動するので必須というわけでもないようです。
あとはこのBigTimerノード
の出力は3つ存在しています。
- 1番目の出力は状態の変化があったときにトリガー出力されるとのことでしたが、出力されている様子はありませんでした。(継続して調べてみたいと思います)
- 2番目の出力にはON/OFFのステータス値が出力されます。ペイロードには毎分ごとに
1
(ON)または0
(OFF)が出力されます。(タイマー2を使用するとONのステータスは2
になるようです。)。 - 3番目の出力は、ON/OFF時の2つの文字列出力(プロパティで出力値の変更が可能)をします。
割と細かいタイマー制御ができるので、ダウンロード数が多いのも納得です。ただ、細かい時刻の設定がOFFSET値として設定することになるので、そのあたりはわかりにくいかなと思いました。
拡張ノードnode-red-contrib-schedex
を使用する
2番目にダウンロード数が多かったのはこちらの拡張ノードでした。
インストール後はパレットの入力
のカテゴリーに配置されます。
では、動作確認をするフローを作成していきます。
injectノード
とschedexノード
とdebugノード
を使っていますが、簡単なものなので解説は不要かと思います。
あとから分かったのですが、このschedexノード
の入力は不要でトリガーが存在しなくても動作してくれました。
schedexノード
のプロパティは先のBigTimerノード
に比べれば比較的少ないですが、一般的に使う分にはこのぐらいでも全く問題ないと思います。設定値は以下の様になっています。
BigTimerノード
に比べてスッキリしています。以下のように設定を行うことで動作できました。タイムゾーンのこともあるのでlatitude、longitudeの設定もあるようです。今回はテストエリアに近いところの設定値を使用しています。
実行するとpayloadにON/OFF時の文字列が出力されます。
時刻の設定以外にも先程のBigTimerノード
と同様に日没などの時刻設定なども可能となっています。
個人的には簡単に時刻設定(OFFSETを使わなくても直接時刻指定可能)ができるのでこちらのほうがおすすめかなと思います。より複雑な設定を行うときはBigTimerノード
を使うとして、そこまで複雑な設定がいらない場合には、schedexノード
を使うのがいいかなと思います。
それにしても両ノードでも指定可能な日没
などの時刻指定は一般的に必要な感じのようですね。
おわりに
Node-RED
でSchedule機能を持つノードの使い方を調べてみました。cronを使わなくてもNode-REDでほとんどのタイマー設定をScheduleすることができるので、非常に便利です。BigTimerノード
を使えばONのタイミングでMQTTの通信もできるというのはいろいろと使いでがあるのかなと思います。ただ、設定が結構面倒に感じることもあるので、自分ならschedexノード
を使って設定を行ってみて、それでも機能が足りない場合に変更するがいいのかなという印象を受けました。
今回はとりあげませんでしたが、ダッシュボードの機能でスケジューリングができる(UI付き)拡張ノードも存在しているようです。こちらをうまく使えば、フローを動作させながらでもSchedule設定もできるので、今までとは違う動作も期待できるのかなと思いました。そのうち、使用してみようかなと思います。