2018年05月15日

さっそくNode-REDの書き方で躓いてしまった…。定数的な変数の保持と再利用ってどうすんだろ

昨日、Node-REDを覚えたので使いたいなぁ…なんてことを何気なく書きまして、色々実験していました。
現在、自宅内のRaspberry Piで行わせている処理の中に次のような流れのものがあります。

(cronで特定の日付日時で起動開始)
  1. 特定のIDと本日日付時刻を利用して作成した文字列でファイル名を作成し、変数Aにファイル名に入れる。
  2. ffmpegで音声ファイルをm4aファイルに変換し、変数Aの名称で保存する。
  3. 変数Aの名称のファイルを、scpでサーバ上へアップロードする。

実際にはもう少し複雑なことをやっていますが、単純かして上のような流れです。これを、Node-RED化したい。
考えた流れは次の通り。

injectで特定のIDを文字列として日時指定起動。
1でファイル名を作成し、msg.payloadに入れる。
2は[exec]でffmpegを実行し、出力ファイル名はmsg.payloadを引数として渡すようにする。
3は[exec]でsshpass&scpを実行し、転送元ファイル名を………どうやって渡そうか……?

いきなり困ってしまった。2でmsgは[exec]の出力(標準出力か、標準エラー出力か、戻り値)になってしまっているので、それを3に渡すことはできない。
何かmsg.payloadを保存しておく方法は無いか…と考えて、globalというものがあることを知った。


injectで特定のIDを文字列として日時指定起動。
1. ファイル名を作成し、msg.payloadに入れる。
2. msgをglobal内の変数に保管する。
3.[exec]でffmpegを実行し、出力ファイル名はmsg.payloadを引数として渡すようにする。
4.globalからmsgに変数に内容を復元。
5.[exec]でsshpass&scpを実行し、転送元ファイル名はmsg.payloadを引数として渡すようにする。

と、これで上手くいきそう。

と思ったのだが、よくよく考えてみたら、この流れは最大3多重で発生する可能性がある。つまり、後から実行された流れがglobalに保存したmsgを上書きしてしまう。コレじゃダメだ。

調べてみると、uuidを設定してその値ごとに保存/復元する方法等、いくつか方法はあるらしいけど、なんだか元々のシェルで書く方法より難しくなりそうな気がしてきた。できれば、こういった技術は物事を単純化させるために使いたい。

うーん、こういう混み入った場合の書き方のベストプラクティスを収集しておく必要がありそうだなぁ。


と、これを書き終わった後で、入力のmsgをそのまま出力のmsgとして返す方法はないかな…と考えていて、functionを使えないかと考えた。
msgを一切いじらず、functionの最後にreturn msg;としてしまえば、入力時のmsg内の変数はそのまま次に引き渡される。

問題はfunctionの中で[exec]相当の自由な実行ができないか…だが、


settings.jsに
functionGlobalContext: {
        child_process:require('child_process')
}


を追加。

var execSync = global.get('child_process').execSync;
execSync("/home/pi/a.sh"); /*←任意のコマンド*/
return msg;


でなんとかなるかな、と。


posted by ayacy at 00:00 | Comment(0) | TrackBack(0) | プログラミング
この記事へのコメント
コメントを書く
お名前: [必須入力]

メールアドレス:

ホームページアドレス:

コメント: [必須入力]

認証コード: [必須入力]


※画像の中の文字を半角で入力してください。
※ブログオーナーが承認したコメントのみ表示されます。
この記事へのトラックバックURL
http://blog.sakura.ne.jp/tb/183220369
※ブログオーナーが承認したトラックバックのみ表示されます。
※言及リンクのないトラックバックは受信されません。

この記事へのトラックバック