hiroki.nakatani
2024年6月29日 0時29分
Armadillo Base OS (Node-RED 対応)
v3.19.2-at.5
を利用し、1分おきに各種センサーデータをMQTT通信する仕組みを構築しております。
センサーデータの取得項目が多いため、一時的にMQTT通信用一時ファイルを生成し、複数レコード追記してから一度にMQTT通信させることにしました。
MQTT通信用一時ファイルの書き込み削除頻度が多く、極力eMMCへの書き込みをさけて長期運用したいのですが、RAMディスク等要件にあう領域があれば教えていただけないでしょうか。
コメント
hiroki.nakatani
hiroki.nakatani
参考の資料を確認していますが、コンテキストの使い方がよくわかりませんでした。(実は先日コンテキスト試そうとして断念してます)
添付のソースに対し、メモリ読み書きに変更したいのですが、やり方を教えていただけないでしょうか。
また、tmpfs へ書き込みができないようですが、どうすれば書き込み可能になりますか。
ファイル | ファイルの説明 |
---|---|
sample.txt | |
メモリ読み書きに変更したい部分.zip |
at_shinya.koga
hiroki.nakatani
> 添付して頂いた二つのファイルについて、それぞれの内容の説明をお願いします。
→sample.txt
センサーデータを取得し、MQTT送信するサンプルソースです。
メモリ読み書きに変更したい部分.zip
現状はファイル書き出し/読み込みしている箇所のスクリーンショットなり、この部分をメモリ内で処理するようにしたいです。
> どのように書込みできないのでしょうか?行われた手順について教えてください。
→Node-RED上でdf -hを実行し、以下の結果からtmpfsが/run/udev配下であることを確認。
/run/udev/配下に対し、ファイルを書き込み/読み込みするようにNode-redの「メモリ読み書きに変更したい部分.zip」のパスを変更した結果、エラーとなりました。
Filesystem Size Used Avail Use% Mounted on
overlay 100M 1.2M 98M 2% /
devtmpfs 10M 0 10M 0% /dev
shm 248M 56K 248M 1% /dev/shm
/dev/mmcblk0p5 2.6G 389M 1.8G 19% /log
tmpfs 100M 1.2M 98M 2% /run/udev
none 248M 60K 248M 1% /run/podman-init
at_shinya.koga
アットマークテクノの古賀です。
hiroki.nakataniさん:
>>どのように書込みできないのでしょうか?行われた手順について教えてください。
>→Node-RED上でdf -hを実行し、以下の結果からtmpfsが/run/udev配下であることを確認。
> /run/udev/配下に対し、ファイルを書き込み/読み込みするようにNode-redの「メモリ読み書きに変更したい部分.zip」のパスを変更した結果、エラーとなりました。
>
>Filesystem Size Used Avail Use% Mounted on
>overlay 100M 1.2M 98M 2% /
>devtmpfs 10M 0 10M 0% /dev
>shm 248M 56K 248M 1% /dev/shm
>/dev/mmcblk0p5 2.6G 389M 1.8G 19% /log
>tmpfs 100M 1.2M 98M 2% /run/udev
>none 248M 60K 248M 1% /run/podman-init
/tmp/ 配下を使ってみてください。
at_shinya.koga
アットマークテクノの古賀です。
>>添付して頂いた二つのファイルについて、それぞれの内容の説明をお願いします。
>→sample.txt
> センサーデータを取得し、MQTT送信するサンプルソースです。
>
> メモリ読み書きに変更したい部分.zip
> 現状はファイル書き出し/読み込みしている箇所のスクリーンショットなり、この部分をメモリ内で処理するようにしたいです。
コンテキストを使うために、フローを次のように変更するというのは、いかがでしょうか?
・「結合」function ノードで、以下の動作を行うようにする:
1.) スコープがフローのコンテキストの、"mqtt.json" というコンテキストキーが存在しなければ、空の配列([])をセットする。
2.) msg.payload にセットしている JSON テキストに相当するオブジェクトを一つ作り、(1) のコンテキストキーが値として持つ配列に push() で追加する。
・「MQTTアップロードデータを設定」function ノードで、以下の動作を行うようにする:
1.) スコープがフローのコンテキストの、"mqtt.json" というコンテキストキーが値として持つ配列の全ての要素について、JSON.stringify() を適用して JSON テキストに変換し、それらを連結した文字列を msg.payload にセットする。
・complete ノードの後段に、以下の動作を行う function ノードを接続する:
1.) スコープがフローのコンテキストの、"mqtt.json" というコンテキストキーの値に空の配列をセットする。
koga
2024年6月30日 12時44分
アットマークテクノの古賀(休日モード)です。
hiroki.nakataniさん:
>Armadillo Base OS (Node-RED 対応)
>v3.19.2-at.5
>を利用し、1分おきに各種センサーデータをMQTT通信する仕組みを構築しております。
>センサーデータの取得項目が多いため、一時的にMQTT通信用一時ファイルを生成し、複数レコード追記してから一度にMQTT通信させることにしました。
>MQTT通信用一時ファイルの書き込み削除頻度が多く、極力eMMCへの書き込みをさけて長期運用したいのですが、RAMディスク等要件にあう領域があれば教えていただけないでしょうか。
一時ファイルを tmpfs に配置すれば、eMMC への書き込みは起きません。
ですが、Node-RED であれば、一時ファイルを使うよりも、Node-RED のコンテキスト(context)を使用するのが良いんじゃないかと思います:
https://nodered.jp/docs/user-guide/context
MQTT で送出するデータを蓄積する際、複数のノードからアクセスするのであれば、スコープがフローのコンテキストを使えばよいですし、一つのノードしかアクセスしないのであれば、スコープがノードのコンテキストを使うのがよいでしょう。
ちなみに、以下の Howto で提供している Node-RED フローでは、スコープがフローのコンテキストを使用しています:
https://armadillo.atmark-techno.com/howto/iotg_a6e-water-leakage-sense
フローの .json ファイルの内容を、こちらで見ることができますが、'sense_context' という名前のコンテキストキーを、フローのコンテキストで使用しています:
https://download.atmark-techno.com/sample/armadillo_iotg_a6e-water-leak…
この例を見て頂くと分かるように、コンテキストキーの値として、配列やオブジェクトなど、任意のデータ型のものを持たせることができますので、便利に使えるのではないかと思います。
以上、参考になりましたら幸いです。