- Home
- Node-REDとプロトコルの統合
- Node-RED 例: センサーデータを Google スプレッドシートに送信する
Node-RED 例: センサーデータを Google スプレッドシートに送信する
説明
このNode-REDの例は、Googleスプレッドシートにデータを送信するソリューションを提供します。このドキュメントではAM102を例として、時刻、温度、湿度をGoogleスプレッドシートに送信します。
要件
- Milesightゲートウェイ: UG56/UG65/UG67
- LoRaWANセンサー
- Googleシートアカウントとリンク
設定手順
ステップ1: Node-RED起動とフロー例インポート
- 1. 「App」>「Node-RED」ページでNode-REDプログラムを有効化し、プログラム読み込み完了まで待機後、「起動」ボタンをクリックしてNode-REDウェブGUIを起動します。
- 2. Node-RED Web GUIにログイン。アカウント情報はゲートウェイWeb GUIと同じです。
- 3. 「Import」をクリックし、内容を貼り付けるかjson形式ファイルをインポートしてNode-REDフロー例をインポートします。
ステップ2: Googleスプレッドシートの設定
1). Googleスプレッドシートを開く
[メニュー] → [エクステンション] → [Apps Script] をクリック
- 2) 以下のコードを貼り付けます。sheet.appendRow で必要なパラメータを data.x の形式で入力してください。
function doPost(e) {
var sheet = SpreadsheetApp.getActiveSpreadsheet().getActiveSheet();
var data = JSON.parse(e.postData.contents);
Logger.log(data); //
sheet.appendRow([data.time, data.temperature, data.humidity]);
return ContentService.createTextOutput(“OK”);
}
3). Webアプリケーションとして保存・デプロイ
右上の「Deploy」→「New Deployment」をクリック
タイプ選択: 「Web application」
説明欄は自由に記入し、実行主体として許可するアカウントを選択
アクセス許可の選択:誰でも(匿名アクセスを含む)
- 4) 「Deploy」をクリック。初回は認証を求められます。指示に従って認証してください。
デプロイ後、Webアプリケーションへのリンク(例:https://script.google.com/macros/s/xxxxxxx/exec)を取得
ステップ3: Node-RED設定
フロー構造:
Content:
| [{“id”:”42d7e9a1c48cf144″,”type”:”tab”,”label”:”流程 2″,”disabled”:false,”info”:””,”env”:[]},{“id”:”cd9ecd6d31343e82″,”type”:”http request”,”z”:”42d7e9a1c48cf144″,”name”:””,”method”:”POST”,”ret”:”txt”,”paytoqs”:”ignore”,”url”:”https://script.google.com/macros/s/AKfycbwhPKWbdxi2Qoo4XDmnTgBQrGGZ5RNdZworDFFZvIEBSMtnBygUqzcuh5thxHQMEK88qg/exec”,”tls”:””,”persist”:false,”proxy”:””,”insecureHTTPParser”:false,”authType”:””,”senderr”:false,”headers”:[],”x”:1000,”y”:380,”wires”:[[]]},{“id”:”acf6d4e10f0460ca”,”type”:”function”,”z”:”42d7e9a1c48cf144″,”name”:”format”,”func”:”msg.headers = {};\nmsg.headers[‘Content-Type’] = ‘application/json’;\n\nmsg.payload = {\n time: (new Date()).toLocaleString(),\n temperature: msg.payload.temperature,\n humidity: msg.payload.humidity\n};\n\nreturn msg;\n”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”libs”:[],”x”:730,”y”:380,”wires”:[[“cd9ecd6d31343e82″,”f45eaef6c25462cc”]]},{“id”:”746b279ebef04a1c”,”type”:”LoRa Input”,”z”:”42d7e9a1c48cf144″,”name”:””,”devEUI”:””,”extendedField”:””,”x”:140,”y”:380,”wires”:[[“b0b6f0d2ccee5ba8”]]},{“id”:”00ad2b86f7ac3648″,”type”:”function”,”z”:”42d7e9a1c48cf144″,”name”:”decode”,”func”:”/**\n * Payload Decoder\n *\n * Copyright 2024 Milesight IoT\n *\n * @product AM102 / AM102L\n */\n// Chirpstack v4\nfunction decodeUplink(input) {\n var decoded = milesightDeviceDecode(input.bytes);\n return { data: decoded };\n}\n\n// Chirpstack v3\nfunction Decode(fPort, bytes) {\n return milesightDeviceDecode(bytes);\n}\n\n// The Things Network\nfunction Decoder(bytes, port) {\n return milesightDeviceDecode(bytes);\n}\n\nfunction milesightDeviceDecode(bytes) {\n var decoded = {};\n\n for (var i = 0; i < bytes.length;) {\n var channel_id = bytes[i++];\n var channel_type = bytes[i++];\n // BATTERY\n if (channel_id === 0x01 && channel_type === 0x75) {\n decoded.battery = bytes[i];\n i += 1;\n }\n // TEMPERATURE\n else if (channel_id === 0x03 && channel_type === 0x67) {\n // ℃\n decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10;\n i += 2;\n\n // ℉\n // decoded.temperature = readInt16LE(bytes.slice(i, i + 2)) / 10 * 1.8 + 32;\n // i +=2;\n }\n // HUMIDITY\n else if (channel_id === 0x04 && channel_type === 0x68) {\n decoded.humidity = bytes[i] / 2;\n i += 1;\n }\n // HISTORY DATA\n else if (channel_id === 0x20 && channel_type === 0xce) {\n var data = {};\n data.timestamp = readUInt32LE(bytes.slice(i, i + 4));\n data.temperature = readInt16LE(bytes.slice(i + 4, i + 6)) / 10;\n data.humidity = bytes[i + 6] / 2;\n i += 7;\n\n decoded.history = decoded.history || [];\n decoded.history.push(data);\n } else {\n break;\n }\n }\n\n return decoded;\n}\n\n/* ******************************************\n * bytes to number\n ********************************************/\nfunction readUInt16LE(bytes) {\n var value = (bytes[1] << 8) + bytes[0];\n return value & 0xffff;\n}\n\nfunction readInt16LE(bytes) {\n var ref = readUInt16LE(bytes);\n return ref > 0x7fff ? ref – 0x10000 : ref;\n}\n\nfunction readUInt32LE(bytes) {\n var value = (bytes[3] << 24) + (bytes[2] << 16) + (bytes[1] << 8) + bytes[0];\n return (value & 0xffffffff) >>> 0;\n}\n\nfunction readInt32LE(bytes) {\n var ref = readUInt32LE(bytes);\n return ref > 0x7fffffff ? ref – 0x100000000 : ref;\n}\nvar buffer = Buffer.from(msg.payload, ‘base64’);\nvar aa = Decoder(buffer);\nmsg.payload = aa;\nmsg.buffer = buffer;\nreturn msg;”,”outputs”:1,”noerr”:0,”initialize”:””,”finalize”:””,”libs”:[],”x”:540,”y”:380,”wires”:[[“acf6d4e10f0460ca”]]},{“id”:”b0b6f0d2ccee5ba8″,”type”:”Device Filter”,”z”:”42d7e9a1c48cf144″,”name”:””,”eui”:”24E124725E282933″,”x”:330,”y”:380,”wires”:[[“00ad2b86f7ac3648”]]},{“id”:”f45eaef6c25462cc”,”type”:”debug”,”z”:”42d7e9a1c48cf144″,”name”:”debug 43″,”active”:true,”tosidebar”:true,”console”:false,”tostatus”:false,”complete”:”false”,”statusVal”:””,”statusType”:”auto”,”x”:880,”y”:280,”wires”:[]}] |
-
- 1) LoRa入力:ネットワークサーバー内のセンサーからすべてのアップリンクメッセージを取得します。
- 2) デバイスフィルター:デバイスEUIでデバイスをフィルタリングします。ここではセンサーEUIをフィルタリングするように設定する必要があります。
- 3) 関数(デコード): データデコードに使用されます。例ではAM102のペイロードです。他のセンサーを使用する場合は、このドキュメントを参照して変更してください。
https://support.milesight-iot.com/support/solutions/articles/73000535734-how-to-use-decoder-on-node-red
- 4) Function(format): この関数は渡されたデータ構造を標準化するために使用されます(タイムスタンプの追加や有効なフィールドの抽出)。msg.payloadに渡す必要があるパラメータを追加できます。
5)Http request: URLにSTEP 2のリンク(https://script.google.com/macros/s/xxxxxxx/exec)をコピーします。その後「done」をクリックします
- 5) デバッグ: デバッグサイドバータブで選択したメッセージプロパティを表示し、オプションで実行時ログも表示します。デフォルトではmsg.payloadを表示しますが、任意のプロパティ、メッセージ全体、またはJSONataの結果を表示するように設定できます。
ステップ4: デプロイと結果の確認
- 1. 「Deploy」をクリックして、すべてのNode-RED設定を保存します。
2. センサーから新しいパケットが報告されると、Node-REDのデバッグ画面とGoogleスプレッドシートの両方でデータを確認できます。
——-以上—–
関連記事
Node-REDとプロトコルの統合
Node-RED 例: 特定のIPからのアクセスを制限するためのiptablesルールの設定Milesightゲートウェイのiptablesルールを永続的に設定するソリューションを提供します
Node-RED 例: Milesight LoRaWAN コントローラ経由で Modbus INT64 タイプ レジスタ値を読み取るMilesight LoRaWANコントローラーを介してModbus INT64型レジスタを読み取るソリューションを提供します
Node-Redでデコーダーを使用する方法MilesightのLoRaWANゲートウェイはノードレッド機能をサポートしており、関連ソリューションのシミュレーションやセットアップを簡単に行うことができます
Gateway に組み込まれた Node-Red を使用して SMS アラームをトリガーする方法Milesight UG6X/UG56ゲートウェイはビルドインNode-Redをサポートしています。このNode-Redの例では、Node-Redを使用してSMSアラームをトリガーするソリューションを提供し、EM300の温度が26℃を超えた場合にSMSアラームをトリガーする例を取り上げます。
Milesightゲートウェイ経由でLoRaWANデバイスをBACnet BMSシステムに統合する方法MilesightゲートウェイはBACnetサーバーとして動作し、LoRaWANデバイスとBMSシステムまたはBACnetデバイス間の通信を設定することができます。
MilesightゲートウェイによるLoRaWAN to Modbus機能の実現方法Milesightゲートウェイは、Modbus RTU over TCPまたはModbus TCPプロトコルを介して、LoRaWANデバイスとModbusクライアント(マスター)間の通信をセットアップするModbusサーバー(スレーブ)として動作し、LoRaWANデバイスをBMSやPLCシステムに迅速かつ簡単に統合することができます。
MilesightゲートウェイでAzureのダウンリンク制御を実現する方法Azure IoT Hub からダウンリンクコマンドを送信し、Node-red 経由でダウンリンクデータを変換することで、デバイスを遠隔操作する方法について、とりあえずの解決策を説明します。
Node-Red の例: VS121&WS202 – WS50xスイッチリンク制御VS121またはWS202を使用して、WS50Xを点灯/消灯させるNode-REDの例を示します。
Node-Red の例: バックネットサーバーの有効化/無効化Node-RED経由でバックネットサーバー機能を有効または無効にするためのソリューションを提供します。
Node-Red ユーザー名とパスワードの変更方法ゲートウェイ WEB GUI と異なる Node-red のログインパスワードを必要とし、Node-red を通じて Node-red のログイン認証情報を直接変更できるアプリケーションに適用されます。
Node-Redの読み取り専用ユーザーを追加する方法Node-Red に読み取り専用のユーザーを追加する方法を説明します。読み取り専用のユーザーは、Node-Red にのみアクセスできますが、フローの変更やフローの展開は許可されていません。
Node-Redを使用してシェルコマンドを実行する方法node-red でシェルコマンドを実行する方法について説明します。
BACnetシステムからMilesightゲートウェイ経由でダウンリンクを送信する方法Milesightゲートウェイは、BMSシステムやBACnet機器からのコマンドをエンコードし、LoRaWAN機器にコマンドを送信することで、遠隔制御を実現します。
Milesight ゲートウェイの Node Red でダッシュボードを使用する方法Milesight ゲートウェイの Node Red ダッシュボードを使用して、センサーのデータを表示する方法について説明します。
Milesight ゲートウェイに追加の Node-RED ノードをインストールする方法ゲートウェイに Node-RED ノードを追加インストールする方法について説明します。
Milesightゲートウェイ経由でLoRaWANセンサーをBACnet BMSシステムに統合する方法Milesight ゲートウェイは、LoRaWAN センサーのデータをデコードし、センサーデータを BMS システムまたは BACnet デバイスで使用される BACnet オブジェクトにマッピングできます。これにより、LoRaWAN デバイスをビル管理システムに迅速かつ容易に統合できます。
Gatewayに組み込まれたNode-Redを使用してDOを制御する方法ゲートウェイに組み込まれた Node-Red 機能を使用して UC501 のデジタル出力ステータスを変更し、EM500-SMT が検出した土壌の湿度に応じて灌漑装置が動作するようにします。
ソリューション / IoT サポート
- Node-RED 例: センサーデータを Google スプレッドシートに送信する 2026年1月10日Googleスプレッドシートにデータを送信するソリューションを提供します




























