【Node-RED】スケジューリング機能(タイマー的、cron的な)を持つ拡張ノードを使ってみる

これは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

実行すると以下のように表示が行われます。

f:id:ueponx:20201216211728p:plain

問題なくバージョンアップが行われたらNode-REDを起動して、フローエディタからバージョンを確認すると、現在の最新バージョンの1.2.6になっていることが確認できます。

f:id:ueponx:20201216211947p:plain

では、スケジュール機能のあるノードをインストールしていきます。

試してみるスケジュール機能を持つノード

今回、使い方を調べようと思った拡張ノードはScheduleのキーワード検索するとかなりの数出てくるのですが、 その中でもダウンロード数が多かったものを2つ調べてみることにします。

f:id:ueponx:20201217012704p:plain

実際に調べてみたものは以下の2種類のf:id:ueponx:20201217000331p:plainものになります。

●node-red-contrib-bigtimer flows.nodered.org

f:id:ueponx:20201216214245p:plain

●node-red-contrib-schedex flows.nodered.org

f:id:ueponx:20201216214301p:plain

ちなみに拡張ノードのインストール方法

拡張ノードのインストールに関してはご存知かもしれませんが、念の為に。

画面右上にある【三】ボタンをクリックしてメニューの中から【パレットの管理】をクリックして選択を行います。

f:id:ueponx:20201216225041p:plain

ユーザ設定の画面が開くので、更に【ノードを追加】タブをクリックします。

f:id:ueponx:20201216225045p:plain

追加するノードを検索する画面になるので、入力ボックスに拡張ノードの名前を入力し検索を行います。

f:id:ueponx:20201216225049p:plain

該当するノードが見つかったら【ノードを追加】ボタンをクリックします。

f:id:ueponx:20201216225052p:plain

インストール確認のダイアログが表示されたら【追加】ボタンをクリックします。これでインストールが開始されます。

f:id:ueponx:20201216225056p:plain

インストール中は画面が以下の様になっています。必要があれば【ログを確認】ボタンで状況を確認するのもいいかと思います。

f:id:ueponx:20201216225100p:plain

処理が成功すると以下のように表示が行われます。

f:id:ueponx:20201216225104p:plain

ボタンの表示も【追加しました】に変更されているので、確認した後【閉じる】ボタンをクリックします。

f:id:ueponx:20201216225107p:plain

これで拡張ノードのインストールができます。以下のノードも同様に追加作業を行ってください。

拡張ノードnode-red-contrib-bigtimerを使用する

f:id:ueponx:20201217000501p:plain

拡張ノードnode-red-contrib-bigtimerがダウンロード数が一番大きなスケジュール機能を持ったタイマーのようです。 インストール後はパレットのその他のカテゴリーに配置されます。

説明としては、特別な日などの機能を備えた究極のNode-REDタイマーということのようです。 設定値としては、月、日、手動オーバーライド、時停止、ランダム値、特別な日の設定、時刻のオフセット指定が可能です。その他に夕暮れ、夜明けのようなバリエーション指定(その他にも日の出、日の入り、月の出、月の出、月の入り)特徴もあります。STOPを使用すると、出力をOFFに設定することもできます。

非常に沢山のパラメーターを設定することができますが、単純なタイマーをしても使用することができます。どちらかといえばLinuxにあるcronサービス+タイマーの便利機能といった表現がいいかもしれません。

設定値のプロパティは以下の様なものが設定できますが、これでも一部といった状況です。

f:id:ueponx:20201216231442p:plain

f:id:ueponx:20201216231453p:plain

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ノード作成としては以下のようになると思います。

f:id:ueponx:20201216232222p:plain

最初のinjectノードはタイマー処理の入力用データを与える役割になります。これがなくてもフローをデプロイすればタイマーは自体は起動するので必須というわけでもないようです。

あとはこのBigTimerノードの出力は3つ存在しています。

  • 1番目の出力は状態の変化があったときにトリガー出力されるとのことでしたが、出力されている様子はありませんでした。(継続して調べてみたいと思います)
  • 2番目の出力にはON/OFFのステータス値が出力されます。ペイロードには毎分ごとに1(ON)または0(OFF)が出力されます。(タイマー2を使用するとONのステータスは2になるようです。)。
  • 3番目の出力は、ON/OFF時の2つの文字列出力(プロパティで出力値の変更が可能)をします。

割と細かいタイマー制御ができるので、ダウンロード数が多いのも納得です。ただ、細かい時刻の設定がOFFSET値として設定することになるので、そのあたりはわかりにくいかなと思いました。

拡張ノードnode-red-contrib-schedexを使用する

2番目にダウンロード数が多かったのはこちらの拡張ノードでした。

f:id:ueponx:20201217000441p:plain

インストール後はパレットの入力のカテゴリーに配置されます。

f:id:ueponx:20201217001056p:plain

では、動作確認をするフローを作成していきます。

f:id:ueponx:20201217001719p:plain

injectノードschedexノードdebugノードを使っていますが、簡単なものなので解説は不要かと思います。 あとから分かったのですが、このschedexノードの入力は不要でトリガーが存在しなくても動作してくれました。

schedexノードのプロパティは先のBigTimerノードに比べれば比較的少ないですが、一般的に使う分にはこのぐらいでも全く問題ないと思います。設定値は以下の様になっています。

f:id:ueponx:20201217002148p:plain

f:id:ueponx:20201217002158p:plain

BigTimerノードに比べてスッキリしています。以下のように設定を行うことで動作できました。タイムゾーンのこともあるのでlatitude、longitudeの設定もあるようです。今回はテストエリアに近いところの設定値を使用しています。

f:id:ueponx:20201217003950p:plain

実行するとpayloadにON/OFF時の文字列が出力されます。

f:id:ueponx:20201217004043p:plain

時刻の設定以外にも先程のBigTimerノードと同様に日没などの時刻設定なども可能となっています。

個人的には簡単に時刻設定(OFFSETを使わなくても直接時刻指定可能)ができるのでこちらのほうがおすすめかなと思います。より複雑な設定を行うときはBigTimerノードを使うとして、そこまで複雑な設定がいらない場合には、schedexノードを使うのがいいかなと思います。 それにしても両ノードでも指定可能な日没などの時刻指定は一般的に必要な感じのようですね。

おわりに

Node-REDでSchedule機能を持つノードの使い方を調べてみました。cronを使わなくてもNode-REDでほとんどのタイマー設定をScheduleすることができるので、非常に便利です。BigTimerノードを使えばONのタイミングでMQTTの通信もできるというのはいろいろと使いでがあるのかなと思います。ただ、設定が結構面倒に感じることもあるので、自分ならschedexノードを使って設定を行ってみて、それでも機能が足りない場合に変更するがいいのかなという印象を受けました。

今回はとりあげませんでしたが、ダッシュボードの機能でスケジューリングができる(UI付き)拡張ノードも存在しているようです。こちらをうまく使えば、フローを動作させながらでもSchedule設定もできるので、今までとは違う動作も期待できるのかなと思いました。そのうち、使用してみようかなと思います。

flows.nodered.org

/* -----codeの行番号----- */