Node-REDを使用したデータ連携機能の実現について

まえがき

お世話になります。
株式会社シムトップスです。

今回はi-Reporterの代理店であるパナソニックFSエンジニアリング株式会社様より、i-Reporterと外部システム連携構築を簡易化(ローコード化)する技術として「i-ReporterとNode REDを使用したデータ連携機能の実現について」という記事を寄稿いただきました。

※Node REDとは
Node-RED(ノードレッド)は、プログラミングの知識がなくても直感的にアプリやシステムの自動化を作れるツールです。ブラウザ上で「ノード」と呼ばれるブロックをつなげて、データの流れ(フロー)を視覚的に設計することができます。

ConMas Gatewayを使った外部システム連携に難しさを感じている方は、是非ご一読いただけますと幸いです。

ご挨拶

はじめまして。
i-Reporterの販売代理店をしている、パナソニックFSエンジニアリング株式会社の木庭と申します。

現場でのデータ活用をもっと手軽に、もっとスムーズにできないか——そんな思いから、i-ReporterとNode-REDを活用したデータ連携方法を考えてみました。

実際に試してみると、シンプルな設定でデータの自動連携が可能になり、業務の効率化がグッと進みました。この便利な手法を、ぜひ皆様にも共有したいと思い、記事にまとめました。

「i-Reporterのデータをもっと活用したい」「ノーコードツールでシステムを柔軟に連携させたい」という方にとって、きっとヒントになる内容になっています。

ぜひ最後までご覧ください!

本連携を構築した背景

あるお客様から、社内システムのUIとしてi-Reporterを使用したいとの相談がありました。そこで、Gateway + Pythonによる連携方法を紹介し、検討を進めていただきました。
しかし、以下の理由によりi-Reporterの導入は見送られることとなりました。

i-Reporter導入を断念した理由

  1. Pythonの学習コスト
    Pythonを習得するための時間が確保できない。
  2. Gateway機能使用時の煩雑さ
    ツール以外の複数のファイルに直接コードを書き込む必要があり、管理が複雑でメンテナンスが困難。
  3. 複雑なSQLの作成が負担
    複雑なSQLを作成する際に、Python内に記述する必要があるため、開発工数が増大。
  4. アクセス先の不明瞭さ
    必要なデータのアクセス先がわかりにくく、管理が難しい。
  5. i-ReporterとPythonファイルの関連性の不明瞭さ
    i-Reporterからのコール先とPythonファイルが直接結びつかず、運用上の負担が大きい。

解決策の提案

  1. Pythonを覚える時間が確保できない
    → ノーコードまたはローコード開発ツールの活用を検討。
  2. Gateway使用時のコード管理の負担軽減
    → i-Reporterから直接呼び出し、直接リターンできる方法を模索。
  3. アクセス先のわかりづらさの解消
    → データの管理・取得を簡素化し、より直感的なアクセス方法を検討。

Node-REDの特徴

  • ビジュアルプログラミング
    Webブラウザ上で動作するフローエディターを提供し、ノードをドラッグ&ドロップで配置しながら、視覚的にワークフローを構築可能。
  • JavaScript対応
    JavaScriptの関数を記述することで、カスタマイズした処理を実装可能。
  • Node.jsベースのランタイム
    軽量で柔軟な環境を提供し、さまざまなデバイス上で動作可能。
  • JSON形式のフロー管理
    作成したフローはJSONで保存され、再利用や共有が容易。
  • MQTT/TLSサポート
    バージョン0.14以降、MQTTノードはTLS接続を確立可能となり、よりセキュアな通信が可能。

Node-REDは、プログラミング初心者でも直感的にシステムを構築できるため、IoTや業務自動化の分野で広く活用されています。

【参照】Node-RED(Wikipedia)

サンプル動作環境

サンプル画面

Node-REDフロー

動作イメージ

まとめ

Node-REDを活用するメリット

1. 教育コストの削減

Node-REDはローコード開発ツールであり、プログラミングの知識が少ない方でも比較的簡単にフローを作成できます。そのため、学習コストを抑えながら、迅速にシステム開発を進めることが可能です。

2. シンプルなファイル構成

従来必要だったDB接続文字列の記述、Actionファイルの管理、スクリプトファイルの作成が不要になります。すべての処理がNode-RED内で完結するため、ファイル構成がすっきりし、管理が容易になります。

3. 複雑なSQL文にも対応

Node-RED内でSQL文を記述できるため、トランザクション処理、外部結合・内部結合、SELECT・INSERT・UPDATEなどの複雑なデータ操作も可能です。

4. 明確なアクセス先

GatewayのアドレスとNode-REDのAPIアドレスが一致するため、システムの接続関係がシンプルになり、運用管理がしやすくなります。

5. 高い拡張性

Node-REDは拡張性に優れた開発ツールであり、以下のような機能を手軽に実装できます。

  • CSVファイルの読み込み・書き込み
  • 他社WebAPIとの連携
  • メールやチャットへの通知送信
  • PLCデータの取得

このように、Node-REDを活用することで、開発の効率化と柔軟なシステム構築が可能になります。

Node-REDを活用するポイント

1. Node-REDでWebAPIを作成

Node-REDを使用することで、ローコードでWebAPIを簡単に作成できます。視覚的なフロー設計により、直感的な開発が可能です。

2. JSONフォーマットのリターン値が重要

Node-REDで作成したWebAPIのリターン値を適切なJSONフォーマットで整えることがポイントになります。クライアント側の処理をスムーズにするため、統一されたデータ構造を設計することが重要です。

この2つのポイントを押さえることで、より効率的なシステム構築が実現できます。

その他、読者の皆様へ

すでにご利用中の方がいらっしゃいましたら、追加の情報を共有いただけますと幸いです。
また、ご意見やご感想をお寄せいただけますと、大変ありがたく存じます。

i-Reporter連携サンプルの説明

以下サンプルの説明を、下記の項目について説明を行います。
また、Node-REDのインストール方法、必要なノードの追加方法、Node-REDの操作方法などに関しては、別途HPを参考に実施してください。
尚、ノードの説明部で、前サンプルと同一のノードに関しては、説明を省略しています。
お手数ですが、前サンプルを参考にしてください。

  • PostgreSQLデータをi-Reporterに表示
  • QRコードをi-Reporterに表示
  • 画像ファイルの表示
  • フォーカスのセット
  • 単一選択クラスタ選択肢のセット

PostgreSQLデータをi-Reporterに表示

フローイメージ

概要

PostgreSQLのデータを取得し、i-Reporterへ表示するサンプルです
inventoryテーブルからデータを取得し、i-Reporterの画面に表示します

使用するノード(追加するノード)

本サンプルでは、PostgreSQLへアクセスするために、以下のNode-REDノードを追加します。

  • node-red-contrib-re-postgres

ノードの設定

http inノード

メソッド: i-Reporteのメソッドと同一にします
URL : URLのエンドポイントを指定します
名前 : コメントとして分かりやすい名前を付けておきます

templateノード

アクセスするためのSQL文を記載します
名前 : コメントとして分かりやすい名前を付けておきます
プロパティー: テンプレートの内容を代入する変数名です
次のpostgresノードが要求している変数がmsg.payload
なので、msg.payloadに代入します
型式: Mustacheテンプレートを指定します
出力形式: 平文を指定します

postgresノード

Name : Postgresノードのコメントを指定します
Sewver : 下記のデータベース接続情報に付けた名前を指定します
Receve query output?:取得したデータを以後のフローで使用する場合に
にチェックを入れます

Name : データベースの接続情報に名前を付けます
Host: サーバ名、サーバのIPアドレスを指定します
Database : データベース名を指定します
Username : ユーザ名を指定します
Password : パスワードを指定します

templateノード

i-Reporterのクラスタに取得したデータを返すための文字列を作成します
このJSON書式でデータを作成します

http responseノード

http inと対をなすノードです
デフォルトのまま使用します

i-Reporterの設定

ソースファイル

[
    {
        "id": "e5093ff27efd600e",
        "type": "http in",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "データ取得",
        "url": "/Get-Data",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 280,
        "y": 4220,
        "wires": [
            [
                "a016c039f0157d8f"
            ]
        ]
    },
    {
        "id": "a016c039f0157d8f",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "SQL",
        "field": "payload",
        "fieldType": "msg",
        "format": "sql",
        "syntax": "mustache",
        "template": "SELECT\n    id\n    , part_no\n    , part_no\n    , part_nam\n    , stock_cnt\nFROM\n    stddb.t_inventory\nORDER BY stock_cnt ASC\nLIMIT 5\n",
        "output": "str",
        "x": 690,
        "y": 4220,
        "wires": [
            [
                "4cc5f7592a8bf6ff"
            ]
        ]
    },
    {
        "id": "4cc5f7592a8bf6ff",
        "type": "postgres",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "postgresdb": "1429ffd5a6603e33",
        "name": "",
        "output": true,
        "perrow": false,
        "rowspermsg": "1",
        "return_on_error": false,
        "limit_queries": "0",
        "limit_by": "payload",
        "limit_value": "1",
        "limit_drop_intermediate": false,
        "limit_drop_if_in_queue": false,
        "outputs": true,
        "x": 880,
        "y": 4220,
        "wires": [
            [
                "85397862ed216455"
            ]
        ]
    },
    {
        "id": "85397862ed216455",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"result\": {\n        \"code\": 0,\n        \"description\": \"Success!!!\"\n    },\n    \"apply\": [\n        {\n            \"sheet\": 1,\n            \"cluster\": 2,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.0.id}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 3,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.0.part_no}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 4,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.0.part_nam}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 5,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.0.stock_cnt}}}\"\n        },\n\n        {\n            \"sheet\": 1,\n            \"cluster\": 7,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.1.id}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 8,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.1.part_no}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 9,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.1.part_nam}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 10,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.1.stock_cnt}}}\"\n        },\n\n        {\n            \"sheet\": 1,\n            \"cluster\": 11,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.2.id}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 12,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.2.part_no}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 13,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.2.part_nam}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 14,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.2.stock_cnt}}}\"\n        },\n\n        {\n            \"sheet\": 1,\n            \"cluster\": 15,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.3.id}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 16,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.3.part_no}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 17,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.3.part_nam}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 18,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.3.stock_cnt}}}\"\n        },\n\n        {\n            \"sheet\": 1,\n            \"cluster\": 19,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.4.id}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 20,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.4.part_no}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 21,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.4.part_nam}}}\"\n        },\n        {\n            \"sheet\": 1,\n            \"cluster\": 22,\n            \"type\": \"string\",\n            \"value\": \"{{{payload.4.stock_cnt}}}\"\n        }\n\n    ]\n}",
        "output": "str",
        "x": 1300,
        "y": 4220,
        "wires": [
            [
                "9d7dfb43e876a634"
            ]
        ]
    },
    {
        "id": "9d7dfb43e876a634",
        "type": "http response",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 1450,
        "y": 4220,
        "wires": []
    },
    {
        "id": "1429ffd5a6603e33",
        "type": "postgresdb",
        "cfgname": "Localhost",
        "hostname": "localhost",
        "port": "5432",
        "db": "postgres",
        "ssl": false
    }
]

QRコードをi-Reporterに表示

フローイメージ

概要

クラスター1に入力した文字列をQRコード化し、i-Reporterの画面に表示させます。

使用するノード(追加するノード)

  • node-red-contrib-image-tools

ノードの設定

http inノード

Barcode Generatorノード

Text : QRコードにする文字列を指定します
今回は、i-Reporterからidという変数で文字列が引き継がれてきます
引き継がれた変数はmsg.payload.idという形で変数に入力されます
Type : 今回はQRコードに変換しますので、QR Codeを選択します

imageノード

Base64形式に変換します
Output : base64を設定します

templateノード

この書式でデータを作成します

i-Reporterの設定

ソースファイル

[
    {
        "id": "e9a3130d5919b122",
        "type": "http in",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "QR作成",
        "url": "/Make-QR",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 290,
        "y": 4480,
        "wires": [
            [
                "659cc17a2ce81dd4"
            ]
        ]
    },
    {
        "id": "659cc17a2ce81dd4",
        "type": "Barcode Generator",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "data": "payload.id",
        "dataType": "msg",
        "barcode": "qrcode",
        "barcodeType": "barcode",
        "options": "",
        "optionsType": "ui",
        "sendProperty": "payload",
        "props": [],
        "x": 710,
        "y": 4480,
        "wires": [
            [
                "613466464d37465f"
            ]
        ]
    },
    {
        "id": "613466464d37465f",
        "type": "jimp-image",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "data": "payload",
        "dataType": "msg",
        "ret": "b64",
        "parameter1": "",
        "parameter1Type": "msg",
        "parameter2": "",
        "parameter2Type": "msg",
        "parameter3": "",
        "parameter3Type": "msg",
        "parameter4": "",
        "parameter4Type": "msg",
        "parameter5": "",
        "parameter5Type": "msg",
        "parameter6": "",
        "parameter6Type": "msg",
        "parameter7": "",
        "parameter7Type": "msg",
        "parameter8": "",
        "parameter8Type": "msg",
        "sendProperty": "payload",
        "sendPropertyType": "msg",
        "parameterCount": 0,
        "jimpFunction": "none",
        "selectedJimpFunction": {
            "name": "none",
            "fn": "none",
            "description": "Just loads the image.",
            "parameters": []
        },
        "x": 890,
        "y": 4480,
        "wires": [
            [
                "de0adf2b1d2ed0a6"
            ]
        ]
    },
    {
        "id": "de0adf2b1d2ed0a6",
        "type": "change",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "data:image/png;base64,",
                "fromt": "str",
                "to": "",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1100,
        "y": 4480,
        "wires": [
            [
                "66027e96639dfcd1"
            ]
        ]
    },
    {
        "id": "66027e96639dfcd1",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"result\": {\n        \"code\": 0,\n        \"description\": \"Success!!!\"\n    },\n    \"apply\": [\n        {\n            \"sheet\": 1,\n            \"cluster\": 32,\n            \"type\": \"image\",\n            \"value\":\"{{{payload}}}\"\n        }\n    ]\n}",
        "output": "str",
        "x": 1300,
        "y": 4480,
        "wires": [
            [
                "0ba54da75fb7fd64"
            ]
        ]
    },
    {
        "id": "0ba54da75fb7fd64",
        "type": "http response",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 1450,
        "y": 4480,
        "wires": []
    }
]
 

画像ファイルの表示

フローイメージ

概要

クラスタ37で選択された画像ファイルを呼び出し、i-Reporterの画面に表示。

使用するノード(追加するノード)

画像データを取得し、Base64形式に変換するために以下のNode-REDノードを追加します。

  • node-red-contrib-image-tools

ノードの設定

http inノード

Resd file

Msg.payload.fl変数にi-Reporterからファイル名を指定
このファイルを読み込む

i-Reporterの設定

ソースファイル

[
    {
        "id": "2a05cf56bd260e0a",
        "type": "http in",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "画像読込",
        "url": "/Make-picture",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 300,
        "y": 4600,
        "wires": [
            [
                "7dcccd963194b66e"
            ]
        ]
    },
    {
        "id": "7dcccd963194b66e",
        "type": "file in",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "filename": "payload.fl",
        "filenameType": "msg",
        "format": "",
        "chunk": false,
        "sendError": false,
        "encoding": "none",
        "allProps": false,
        "x": 720,
        "y": 4600,
        "wires": [
            [
                "83fddd4210b2173b"
            ]
        ]
    },
    {
        "id": "83fddd4210b2173b",
        "type": "jimp-image",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "data": "payload",
        "dataType": "msg",
        "ret": "b64",
        "parameter1": "",
        "parameter1Type": "msg",
        "parameter2": "",
        "parameter2Type": "msg",
        "parameter3": "",
        "parameter3Type": "msg",
        "parameter4": "",
        "parameter4Type": "msg",
        "parameter5": "",
        "parameter5Type": "msg",
        "parameter6": "",
        "parameter6Type": "msg",
        "parameter7": "",
        "parameter7Type": "msg",
        "parameter8": "",
        "parameter8Type": "msg",
        "sendProperty": "payload",
        "sendPropertyType": "msg",
        "parameterCount": 0,
        "jimpFunction": "none",
        "selectedJimpFunction": {
            "name": "none",
            "fn": "none",
            "description": "Just loads the image.",
            "parameters": []
        },
        "x": 890,
        "y": 4600,
        "wires": [
            [
                "ac767862aee316a1"
            ]
        ]
    },
    {
        "id": "ac767862aee316a1",
        "type": "change",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "rules": [
            {
                "t": "change",
                "p": "payload",
                "pt": "msg",
                "from": "data:image/png;base64,",
                "fromt": "str",
                "to": "",
                "tot": "str"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1100,
        "y": 4600,
        "wires": [
            [
                "4c8d32ffa9bc11ee"
            ]
        ]
    },
    {
        "id": "4c8d32ffa9bc11ee",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"result\": {\n        \"code\": 0,\n        \"description\": \"Success!!!\"\n    },\n    \"apply\": [\n    {\n        \"sheet\": 1,\n        \"cluster\": 34,\n        \"type\": \"image\",\n        \"value\":\"{{{payload}}}\"\n    }\n    ]\n}",
        "output": "str",
        "x": 1300,
        "y": 4600,
        "wires": [
            [
                "5c1d265fe120ddfa"
            ]
        ]
    },
    {
        "id": "5c1d265fe120ddfa",
        "type": "http response",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 1450,
        "y": 4600,
        "wires": []
    }
]

フォーカスのセット

フローイメージ

概要

クラスタ35で指定されたクラスタ番号にフォーカスを移動する。
アクションクラスタにフォーカスをセットすると、そのアクションを実行。

この方法を活用することで、特定のデータ入力後に自動的にフォーカスを移動し、スムーズなワークフローを実現できます。

使用するノード(追加するノード)

追加するノードなし

ノードの設定

http inノード

templateノード

i-Reporterの設定

ソースファイル

[
    {
        "id": "bce3b44ea5fd7c32",
        "type": "http in",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "フォーカスセット",
        "url": "/Set-focus",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 330,
        "y": 4840,
        "wires": [
            [
                "f7e7778f83b25cae"
            ]
        ]
    },
    {
        "id": "f7e7778f83b25cae",
        "type": "change",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "rules": [
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "payload.clid",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1080,
        "y": 4840,
        "wires": [
            [
                "68c4e54ba5fc454e"
            ]
        ]
    },
    {
        "id": "68c4e54ba5fc454e",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "field": "payload",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"result\": {\n        \"code\": 0,\n        \"description\": \"Success!!!\"\n    },\n    \"apply\": [\n        {\n            \"sheet\":1,\n            \"cluster\":{{{payload}}},\n            \"type\":\"SetFocus\",\n            \"value\": \"\"\n        }\n    ]\n\n}",
        "output": "str",
        "x": 1300,
        "y": 4840,
        "wires": [
            [
                "92a9e28385c334b8"
            ]
        ]
    },
    {
        "id": "92a9e28385c334b8",
        "type": "http response",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 1450,
        "y": 4840,
        "wires": []
    }
]

単一選択クラスタ選択肢のセット

フローイメージ

概要

外部データベースのデータを取得し、単一選択クラスタの選択肢として設定。

使用するノード(追加するノード)

PostgreSQLへアクセスするため、以下のNode-REDノードを追加します。

  • node-red-contrib-re-postgres

ノードの設定

http inノード

templateノード

今回はDBをアクセスするため、msg.base_dataと言う変数にリターン文字列を作成しておき
ます

changeノード

外部データベースから取得した変数msg.payloadに入ったデータを
msg.base_data.appy.0.selectitemsに代入します
その後、msg.base_data をmsg.payloadに入れなおします

jsonノード

このノードでmsg.payloadに入れたJSONオブジェクトをJSON文字列に変換します

i-Reporterの設定

ソースファイル

[
    {
        "id": "2ea56ea0b25a0857",
        "type": "http in",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "単一選択クラスタ選択肢取得",
        "url": "/Get-tnam",
        "method": "get",
        "upload": false,
        "swaggerDoc": "",
        "x": 360,
        "y": 4900,
        "wires": [
            [
                "2fa4f08a98cd25fd"
            ]
        ]
    },
    {
        "id": "2fa4f08a98cd25fd",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "ベースJSON",
        "field": "base_data",
        "fieldType": "msg",
        "format": "json",
        "syntax": "mustache",
        "template": "{\n    \"result\": {\n        \"code\": 0,\n        \"description\": \"Success!!!\"\n    },\n    \"apply\": [\n        {\n            \"item\": \"list1\",\n            \"sheet\": {{{payload.sheet}}},\n            \"cluster\": {{{payload.cluster}}},\n            \"type\": \"SetItemsToSelect\",\n            \"value\": \"\"\n            \n        }\n    ]\n}",
        "output": "json",
        "x": 590,
        "y": 4900,
        "wires": [
            [
                "c1b53a7404b91999"
            ]
        ]
    },
    {
        "id": "c1b53a7404b91999",
        "type": "template",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "SQL",
        "field": "payload",
        "fieldType": "msg",
        "format": "sql",
        "syntax": "mustache",
        "template": "SELECT\n      player_nam AS item\n    , player_nam AS label\n    , false AS selected\nFROM\n    stddb.t_player\nWHERE\n    tema_nam={{{payload.tnam}}}",
        "output": "str",
        "x": 750,
        "y": 4900,
        "wires": [
            [
                "243b5892a658a184"
            ]
        ]
    },
    {
        "id": "243b5892a658a184",
        "type": "postgres",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "postgresdb": "1429ffd5a6603e33",
        "name": "",
        "output": true,
        "perrow": false,
        "rowspermsg": "1",
        "return_on_error": false,
        "limit_queries": "0",
        "limit_by": "payload",
        "limit_value": "1",
        "limit_drop_intermediate": false,
        "limit_drop_if_in_queue": false,
        "outputs": true,
        "x": 900,
        "y": 4900,
        "wires": [
            [
                "4cbadf09c151a876"
            ]
        ]
    },
    {
        "id": "4cbadf09c151a876",
        "type": "change",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "データOBJ追加",
        "rules": [
            {
                "t": "set",
                "p": "base_data.apply.0.selectItems",
                "pt": "msg",
                "to": "payload",
                "tot": "msg"
            },
            {
                "t": "set",
                "p": "payload",
                "pt": "msg",
                "to": "base_data",
                "tot": "msg"
            }
        ],
        "action": "",
        "property": "",
        "from": "",
        "to": "",
        "reg": false,
        "x": 1080,
        "y": 4900,
        "wires": [
            [
                "48f412aaa05f34b6"
            ]
        ]
    },
    {
        "id": "48f412aaa05f34b6",
        "type": "json",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "property": "payload",
        "action": "str",
        "pretty": false,
        "x": 1290,
        "y": 4900,
        "wires": [
            [
                "c7f2de45cf870ec8"
            ]
        ]
    },
    {
        "id": "c7f2de45cf870ec8",
        "type": "http response",
        "z": "3b9d424424fa37f2",
        "g": "beaca7f0903c3bfb",
        "name": "",
        "statusCode": "",
        "headers": {},
        "x": 1450,
        "y": 4900,
        "wires": []
    },
    {
        "id": "1429ffd5a6603e33",
        "type": "postgresdb",
        "cfgname": "Localhost",
        "hostname": "localhost",
        "port": "5432",
        "db": "postgres",
        "ssl": false
    }
]

いかがでしたでしょうか?本記事が少しでもお役に立てれば幸いです。
最後までお読みいただき、誠にありがとうございました。
ご不明な点がございましたら、ぜひ下記のアドレスまでお気軽にお問い合わせください。
ご連絡をお待ちしております。

バージョンについて
i-Reporter : 5.2.24021
Gateway : 2.1.230600
▼注意事項
・本記事の内容をもとに構築された仕組みによって生じた損害などについては、当方では一切の責任を負いかねます。
・本記事の内容について株式会社シムトップスによる開発、技術支援やサポートをは行いませんので、あらかじめご了承ください。
・ConMas Gatewayの仕様変更により、本連携機能が利用できなくなる可能性がございます。

執筆者・お問合せ先:
パナソニックFSエンジニアリング株式会社

お問い合わせ先

https://www.panasonic.com/jp/company/pfseg.html
パナソニックFSエンジニアリング株式会社 ソリューション統轄部 IoTソリューション部
担当:大塚 篤 / 村瀬 達也
TEL:03-6714-4521 / 03-6714-4535
メールアドレス:pfseginfo@ml.jp.panasonic.com

※お問い合わせは、上記メールアドレスまでお願いいたします。
※業務の都合上、ご返信が遅くなる場合がございます。あらかじめご了承ください。
※販売代理店様からのお問い合わせはご遠慮くださいますようお願いいたします。

導入社数4,000社以上!
ペーパレスアプリでの
シェアNo.1

i-Reporter

(アイレポーター)

使い慣れたエクセル帳票から
そのまま移行できる
現場帳票の電子化システム

3分で分かる資料ダウンロード

現場帳票のデジタル化相談してみる