Node-REDのノードまとめ[追記中]

  • 1
    いいね
  • 0
    コメント

Node-REDのノードまとめ

実務にてNode-REDを使うことになり、現在継続的に学習をしています。
主に、組み込みのノードとその機能や利用方法についてまとめていく予定です。

そもそもNode-REDがわからないという方は、はてなブログにて紹介記事を書いていますので、よかったらそちらも参照ください。

ノードとは

Node-REDにおけるノードは、フローの中でメッセージを一方向へ流します。
基本的に前のノードから入力としてメッセージを受け取り、任意の処理を行ったのちに、次のノードへメッセージの出力を行います。
これらのノードをワイヤでつなげていくことで、視覚的にフローを記述していきます。

ノードの拡張について

今回は主に組み込みのノードについてまとめていますが、はじめに拡張についても少し紹介しておきます。

Node-REDでは、フローだけでなくノードを作成することもできます。
ノードの作成の詳細については、Node-RED日本ユーザ会にて公式ドキュメントの日本語訳がありますので、参照してください。

また、node-redのgithubにて、いくつか拡張のためのノードも公開されています。
個人的なお勧めは、UIを簡単に作れるnode-red-dashboardです。

組み込みのノード

記事内で組み込みのノードと呼ぶ時、それはNode-REDインストール時から利用できるノードを指します。
初めは基礎としてこれらのノードの使い方を覚えることになると思います。
Node-REDの基本的なフローはこれらのノードにて記述できます。
以下にそれらをまとめていきます。

組み込みのノードのカテゴリ一覧

以下は、Node-REDに標準で組み込まれているノードのカテゴリ一覧とその概要です。

  • input : 入力ノード群。基本的に左端に接続を持たず、フローの始端になる。
  • output: 出力ノード群。基本的に右端に接続を持たず、フローの終端になる。
  • function: なんらかの処理を行うノード群。左端と右端に接続を持つ。
  • social: Twitter, emailと言ったSNS等のとの連携を行うノード群。
  • storage: ファイルなどの永続化機構との連携を行うノード群。
  • analysis: 分析の際に用いるノード群。
  • advanced: Node-REDの動作環境との連携を行うノード群。

inputカテゴリ

inputのカテゴリに含まれるのは、入力ノード群です。
基本的には左端に接続を持たず、フローの左端になります。
メッセージを定期的に発生させたり、例外をキャッチしたり、httpのリクエストに応じてフローを開始するなど、フローの起点になるノード群です。

injectノード

手動または定期的にメッセージをフローに挿入します。
メッセージのペイロードには、文字列、JavaScriptオブジェクト、現在の時刻など、さまざまな種類があります。

出力

payload [various]

メッセージが設定されたペイロード。

topic [string]

ノードで設定できるオプションのプロパティ。

詳細情報

injectノードは、特定のペイロード値を有するフローを開始することができます。
デフォルトのペイロードは、1970年1月1日以降のミリ秒単位の現在時刻のタイムスタンプとなります。

このノードは、文字列、数値、ブール値、JavaScriptオブジェクト、またはフロー/グローバルコンテキスト値の注入もサポートしています。
デフォルトでは、ノードはエディタ内のボタンをクリックすることによって手動でトリガします。
定期的にまたはスケジュールに従ってトリガするように設定することもできます。
フローが開始されるたびに1回注入するように設定することもできます。

※「時間間隔」と「特定の時刻に」のオプションは、標準のcronシステムを使用します。
つまり、20分は20分後ではなく、次の1時間、20分後、40分後になります。
今から20分おきにしたい場合は、「間隔」オプションを使用してください。

※文字列に改行を含めるには、関数ノードを使用してペイロードを作成する必要があります。

catchノード

同一タブ内で発生した例外をキャッチするためのノードです。

出力

error.message [string]

発生したエラーのメッセージ

error.source.id [string]

エラーを投げたノードのid

error.source.type [string]

エラーを投げたノードの種類

error.source.name [string]

エラーを投げたノードの名前

詳細情報

通常では、ノードがメッセージを処理している間にエラーをスローした場合はフローが停止します。

catchノードを使用してこれらのエラーをキャッチし、例外処理専用のフローでそれらを処理できます。

デフォルトでは、ノードは同じタブのノードによってスローされたエラーをキャッチします。
特定のノードをターゲットに設定することもできます。

エラーがスローされると、一致するすべてのcatchノードがメッセージを受信します。

サブフロー内でエラーがスローされた場合、エラーはサブフロー内のすべてのキャッチノードによって処理されます。存在しない場合、エラーはサブフローインスタンスが存在するタブまで伝播されます。

メッセージにすでにエラープロパティがある場合は、_errorにコピーされます。

statusノード

同じタブの他のノードから、ステータスメッセージを取得します。

出力

status.text [string]

ステータスのテキスト

status.source.type [string]

ステータス取得先のノードのタイプ

status.source.id [string]

ステータス取得先のノードのid

status.source.name [string]

ステータス取得先のノードの名前(設定されている場合)

詳細情報

このノードはペイロードを生成しません。

デフォルトでは、ノードはすべてのノードのステータスを同じワークスペース・タブに報告します。
個々のノードの状況を選択的に報告するように設定することもできます。

linkノード

ノード及びフロー間の仮想ワイヤを作成します。

出力

なし

詳細情報

ノードは、任意のタブに存在するリンクアウトノードに接続できます。接続されると、あたかも一緒に配線されているかのように動作します。

リンクノード間の配線は、リンクノードが選択されている場合にのみ表示されます。
他のタブへの配線があれば、クリックして適切なタブにジャンプすることができる仮想ノードが表示されます。

mqttノード

MQTTブローカーに接続し、指定されたトピックからメッセージを購読します。

出力

payload [string | buffer]

バイナリバッファとして検出されない限り、文字列となる。

topic [string]

MQTTトピックは、/を階層分離記号として使用する。
qos [number]
0、火と忘れ - 1、少なくとも1回 - 2回、1回と1回のみ。
retain [boolean]
真の場合、古いメッセージである可能性があることを示す。

詳細

サブスクリプション・トピックには、MQTTワイルドカード(1つの場合+、複数の場合#)を含めることができます。
このノードを構成するには、MQTTブローカーへの接続が必要です。これは、鉛筆アイコンをクリックすると設定されます。

いくつかのMQTTノード(inまたはout)は、必要に応じて同じブローカ接続を共有できます。

httpノード

Webサービスを作成するためのHTTPエンドポイントを作成します。

出力

payload

GETリクエストの場合、クエリ文字列パラメータのオブジェクトが含まれます。それ以外の場合は、HTTP要求の本文が含まれます。

req [object]

HTTPリクエストオブジェクト。このオブジェクトには、要求に関する情報を提供する複数のプロパティが含まれています。

  • body
  • headers
  • query
  • params
  • cookies
  • files
# res [object]

HTTP応答オブジェクト。このプロパティは直接使用しないでください。
HTTP応答ノードには、要求への応答方法が文書化されています。
このプロパティーは、応答ノードに渡されるメッセージに付加されたままでなければなりません。

詳細

ノードは、特定のタイプの要求に対して、設定されたパスで待ち受けます。

/user などのパスを完全に指定するか、/user/:nameなどの任意の値を受け入れる名前付きパラメータを含めることができます。

名前付きパラメータが使用された場合、要求の実際の値は msg.req.paramsからアクセスできます。

POSTやPUTなどの本体を含む要求の場合、要求の内容はmsg.payloadとして使用可能になります。

リクエストのコンテンツタイプを判別できる場合、本文は適切なタイプに解析されます。たとえば、application/jsonはJavaScriptオブジェクト表現に解析されます。

注:このノードは直接要求に対する応答を送信しません。
そのためフローには、要求を完了するためのHTTP応答ノードが含まれている必要があります。

websocketノード

WebSocket入力ノード。

デフォルトでは、WebSocketから受け取ったデータはmsg.payloadに格納されます。
正しく構成されたJSON文字列を期待するようにソケットを構成することができます。
この場合、JSONを解析し、結果のオブジェクトをメッセージ全体として送信します。

tcpノード

TCP入力の選択肢を提供します。リモートTCPポートに接続するか、着信接続を受け入れることができます。

注:一部のシステムでは、1024未満のポートにアクセスするにはrootまたは管理者のアクセスが必要な場合があります。

udpノード

Buffer、string、またはbase64でエンコードされた文字列を含むmsg.payloadを生成するUDP入力ノード。マルチキャストをサポートします。

また、メッセージを受信したIPアドレスとポートにmsg.ipmsg.portを設定します。

注:一部のシステムでは、1024以下のポートおよび/またはブロードキャストを使用するには、rootまたは管理者のアクセスが必要な場合があります。

outputカテゴリ

outputのカテゴリに含まれるのは、出力のノード群です。
基本的には右端に接続を持たず、フローの終端になります。
inputのカテゴリに含まれるノードに対応したものも多いです。
デバッグタブへログを出力したり、httpのレスポンスを返したりと、外部へ出力するノードがまとめられています。

debugノード

debugノードは、任意のノードの出力に接続できます。サイドバーの[デバッグ]タブに任意のメッセージプロパティの出力を表示するために使用できます。デフォルトでは、msg.payloadが表示されます。

各メッセージには、timestampmsg.topic、および出力するように選択されたプロパティのタイプも表示されます。

サイドバーは、右上隅のオプションドロップダウンからアクセスできます。

ノードの右側にあるボタンは、その出力をオンとオフに切り替えるので、デバッグウィンドウを混乱させることがあります。

ペイロードがオブジェクトまたはバッファである場合は、最初に文字列で表示され、 "(Object)"または "(Buffer)"と表示されます。

特定のメッセージを選択すると、それを報告したデバッグノードが強調表示されます(赤色)。複数のデバッグノードを接続する場合に便利です。

オプションで、完全なmsgオブジェクトを表示し、コンソールログにメッセージを送信することもできます。

さらに、node.warnまたはnode.errorの呼び出しがここに表示されます。

linkノード

フロー間に仮想ワイヤを作成します。

ノードは、任意のタブに存在するノードの任意のリンクに接続できます。接続されると、あたかも一緒に配線されているかのように動作します。

リンクノード間の配線は、リンクノードが選択されている場合にのみ表示されます。他のタブへの配線があれば、クリックして適切なタブにジャンプできる仮想ノードが表示されます。

サブフローに出入りするリンクを作成することはできません。

mqttノード

MQTTブローカーに接続し、メッセージをパブリッシュします。

msg.payloadは、公開されたメッセージのペイロードとして使用されます。オブジェクトが含まれている場合は、送信前にJSONに変換されます。

使用されるトピックは、ノードで構成することも、ブランクのままにした場合は{msg.topic`で設定することもできます。

同様に、QoSおよび保持値はノードで構成できます。空白のままにした場合は、それぞれmsg.qosおよびmsg.retainで設定します。デフォルトでは、メッセージはQoS 0で公開され、保持フラグはfalseに設定されています。

http responseノード

HTTP入力ノードから受信したHTTPリクエストへのレスポンスを返します。

レスポンスは、次のメッセージプロパティを使用してカスタマイズできます。

レスポンスのbodyにはペイロードが設定されます。

statusCodeが設定されている場合はレスポンスステータスコードとして使用されます(デフォルト:200)
headerが設定されている場合、ヘッダーとして追加するフィールドと値のペアを含むオブジェクトである必要があります。
cookieが設定されている場合は、クッキーを設定または削除するために使用できます。

クッキーの取り扱い

cookiesプロパティは、名前と値のペアのオブジェクトでなければなりません。値は、デフォルトオプションを使用してクッキーの値を設定する文字列か、オプションのオブジェクトにすることができます。

次の例では、2つのCookieを設定します.1つはnickという値の名前、もう1つは1234の値のセッション、15分の有効期限が設定されたセッションです。

msg.cookies = {
name:'nick',
session:{
value: '1234',
maxAge:900000
}
}
有効なオプションは次のとおりです。

  • domain - (String)ドメイン名
  • expires - (Date)GMTでの有効期限。指定されていない場合、または0に設定されている場合は、セッションCookieを作成します。
  • maxAge - (文字列)ミリ秒単位の現在の時刻に対する相対的な有効期限
  • path - (String)クッキーのパス。デフォルトは/
  • value - (String)Cookieに使用する値。クッキーを削除するには、その値をnullに設定します

websocketノード

WebSocket outノード。

デフォルトでは、msg.payloadはWebSocket経由で送信されます。 msgオブジェクト全体をJSON文字列としてエンコードし、WebSocketで送信するようにソケットを設定できます。

このノードに到着したメッセージがWebSocket Inノードで開始された場合、メッセージはフローをトリガしたクライアントに返されます。それ以外の場合、メッセージは接続されているすべてのクライアントにブロードキャストされます。

WebSocket Inノードで開始したメッセージをブロードキャストする場合は、フロー内のmsg._sessionプロパティを削除する必要があります。

tcpノード

TCP出力の選択肢を提供します。リモートTCPポートに接続するか、着信接続を受け入れるか、またはTCP Inノードから受信したメッセージに応答することができます。

msg.payloadだけが送信されます。

msg.payloadがバイナリデータのBase64エンコーディングを含む文字列である場合、Base64デコードオプションは送信前にバイナリに変換されます。

msg._sessionが存在しない場合、ペイロードは接続されているすべてのクライアントに送信されます。

udpノード

このノードはmsg.payloadを指定されたUDPホストとポートに送信します。マルチキャストをサポートします。

msg.ipmsg.portを使用して宛先値を設定することもできますが、静的に設定された値が優先されます。

ブロードキャストを選択する場合は、ローカルブロードキャストIPアドレスにアドレスを設定するか、グローバルブロードキャストアドレスである255.255.255.255を試してみてください。

注:一部のシステムでは、1024以下のポートを使用したり、ブロードキャストするには、rootである必要があります。

serialノード

アウトバウンドシリアルポートへの接続を提供します。

msg.payloadだけが送信されます。

オプションで、入力を分割するために使用される改行文字は、シリアルポートに送信されるすべてのメッセージに付加することができます。

バイナリペイロードは、Bufferオブジェクトを使用して送信できます。

Watson IoTノード

IBM Watson Internet of Things Platformにデバイス・イベントを送信します。

ノードは、デバイスまたはゲートウェイとして、登録モードで、またはクイックスタートサービスを使用して接続できます。

クイックスタートサービスを使用して接続する場合、接続にはnode-red-wiotpのデバイスタイプとノードで設定可能なランダムに生成されたデバイスIDが使用されます。ノードからのイベントは、クイックスタートダッシュボードで表示できます。

送信されるイベントのタイプは、ノードで構成することも、空白のままにする場合は、msg.eventプロパティーで設定することもできます。クイックスタートサービスを使用している場合は、クイックスタートダッシュボードに表示されるデータのイベントタイプをイベントに設定する必要があります。

イベントのフォーマットはデフォルトでjsonに設定されますが、別の値に設定することもできます。空白のままにすると、msg.formatプロパティで設定できます。

イベントのデータはmsg.payloadから取得されます。 formatjsonに設定されている場合、このノードは適切にデータをエンコードしようとします。

データがフォームのオブジェクト:{d:{...}}の場合、そのまま使用されます。同様に、そのようなオブジェクトの文字列表現であれば、それ以上のエンコーディングは行われません。
他のタイプのオブジェクト、たとえば番号の場合、{"d":{"value":123}}として送信されます。
formatが他のものに設定されている場合、データはそのままの状態で渡されます。

ゲートウェイとして接続すると、イベントの代わりに送信されるデバイスのタイプとIDをノードで設定することができます。また、空白のままにしておくと、msg.deviceTypeおよびmsg.deviceIdプロパティで設定できます。ノードまたはメッセージのいずれかにこれらのプロパティーが指定されていない場合、ゲートウェイ自体のタイプとIDが使用されます。

play audioノード

ブラウザでオーディオを再生するノード。

動作させるにはエディタのWebページを開く必要があります。

msg.payloadにwavファイルのバッファを格納することを想定しています。

ブラウザがText-to-Speechをネイティブにサポートしている場合は、msg.payloadを読み上げる文字列にすることもできます。

参考文献