今回はインジェクトノードによる定期処理とそのヒントを説明します。
インジェクトノード
インジェクトノードというのはNode-REDの最初のサンプルでほぼ間違いなく使われるノードです。左の四角い所を押すと現在時刻や文字列、JSONオブジェクトなど設定したデータがmsg.payloadにセットされて送信されます。
インジェクトノードは多機能で、起動時にメッセージを送信して初期処理を実現できますし、「繰り返し」の設定で定期的にメッセージを送信してポーリング処理やバッチ処理を実現することもできます。「繰り返し」をセットすると、インジェクトノードに丸矢印が表示されます
ポーリング処理とバッチ処理
ポーリング処理というのはデータ取得の方法です。センサーや通信装置などからデータが送られ無い場合、プログラムの側からデータを取りに行く必要がありますので、求められる時間間隔でポーリングし(取りにいき)ます。
バッチ処理というのは必ずしも定期処理ではなく、まとめ処理を実行するという意味です。UNIX系のcron処理やジョブスケジューラやタスクスケジューラなどと組み合わせて定期処理を実現されることも多いので、ここではバッチ処理と呼びます。
フロントエンドで受信したデータを蓄積し、バックエンドのバッチ処理で定期的にまとめて処理します。こうすることで同時処理を避けることができ、CPUやメモリなどのリソースを効率よく利用することができます。
インジェクトノードによる定期処理
インジェクトノードの「繰り返し」では、以下の3種類(と「なし」)を設定できます。
指定した時間間隔
サーバやセンサから定期的にデータを取得したり、DBにあるデータを定期的に処理する場合に用います。秒、分、時間で指定できます。
指定した時間間隔、日時
曜日と時間帯を1時間単位に指定し、分単位で定期的に処理ができます。cronで実行されるので、あまり精度は期待できません。
指定した日時
曜日と時刻を分単位に指定し、定期的に処理ができます。cronで実行されるので、あまり精度は期待できません。
ヒント
より短い間隔で実行する
例えば0.5秒ごとに実行したい場合は、インジェクトノードを1秒間間隔で指定し、出力を二股に分けて一方をディレイノードで500ミリ秒遅延させます。こうすると、メッセージが0.5秒ごとに送られる様になります。
片側に1ms、もう一方に501msのディレイを入れると一旦両方のディレイノードが実行されるので、 より精度が上がるでしょう。ただし、精度はそれなりですので、あまり細かくしたり、後続の処理が重かったりすると、うまく動かないので注意してください。
重複に注意
繰り返しの時間感覚よりも処理時間がかかると処理が重複しますので、注意してください。処理が重複すると、同じデータを2回処理してしまったり、メモリなどのリソースが不足する可能性があります。
別の方式も検討する
バッチ処理の場合、ディレイノードでキューイングする方法も検討してください。この場合、実行中のデータは保存されないので気をつけてください(バッチ処理でも蓄積する際に永続化しないなら同じです)。このほかにも、クラウドのサービスなどでもキューイングできるでしょう。
まとめ
インジェクトノードによる定期処理とそのヒントを説明しました。IoT開発ツールとして以前から繰り返し実行ができましたが、最近はノードに繰り返しの表示が出る様になって、より使いやすくなりました。
Node-REDの面白いところは、シンプルな機能を組み合わせて色々なことが簡単にできる所だと思います。ぜひ、みなさんもインジェクトノードを使って色々と工夫してください。
おまけ
標準のインジェクトノードでも工夫次第で様々な処理が可能ですが、bigtimerノードならより直感的な設定ができるようです。