
昨日Grafanaへの表示のためのデータ収集にESP32のプログラムが書いていて、社内ネットワークが原因でMQTT送信ができない事がわかった。なのでテスト用無線LANの設定を依頼しておいた。
待っているだけだと時間の無駄なので受信した後のデータ処理を考えていた。処理と言ってもカンマ区切で1つの文字列になって入って来るのを分割する方法を。しかし、これがネットに例が出ていないので困った。分割で検索すると、確かに一連の文字列が分割されるが同じノードに出力されてしまうものばかり。
同じノードに出力されるとその下流のinfluxdb outではmeasurementが1つしか設定できないから全部同じところに値が入ってしまって具合が悪い。どうしても別のノードに出力させないといけない。
と、考えに考えてできたのが下記。
まず最初にはinjectノードでダミーのデータを送って分割してみた。

これはできた後だけれど、ここまでくるのにだいぶ時間がかかった。

ちゃんと異なるノードに分割されて出ているのがわかる。
これがinjectノードから送っている文字列。(数字をカンマ区切でいくつも送っている。)

まず文字列をカンマで分割。
もともとカンマ区切だけれどもカンマは区切文字でなくて単なる文字の1つと認識されているので正式に区切る。
区切ると1つ1つの文字(列)は出口が1つなので次々と下流のノードへ向かって出て行くだけ。

Splitから次々と出てきた文字(列)は一見数字に見えるが実は文字であって数字でないのでこれを計算のできる数字に変換する。変換は区切られた1個1個に対して行われる。

Splitでせっかく区切ったのだけれど、また1つの塊になるようにくっつける。くっつけると言っても、全く1つのものにするのではなくて配列にする。なぜなら、配列にしておいた方が個別より扱い易いから。

そしてここがメインのfunctionノード。
配列になっているのでその何番目かを指定して値を取出している。1つのfunctionで6つのうち1個だけ取り出すのでfunctionは6個必要になる。番号は0〜5。
注意しないといけないのは、msg.payloadをまず配列の変数に入れる事。その変数に[番号]を指定する事で1つ取り出せる。もう1つ大切なのはfunctionから出せるのは数字でも文字列でもないそうで、メッセージにそれを入れて出さないとエラーになる。

前回、数字で出力しようとしてエラーが出て、あっ文字列でないと...と思ったらそれは間違いで、「メッセージ」の形になっていると言うのが正しいとの事だった。
ここまで来たところで、実際のデータ受信モードに変更。
Injectionの代わりにmqttノードを設置。

出力側にinfluxdb outを設置。

全体像はこうなる。

しかし、Node-REDはコードを書かなくて良いからやるものなのだが、実際にはJavascriptを知らないとできない事もけっこう多いとわかった。changeとfunctionの中は、あれはコードとも言えない位にちょっとしたコードだけれど、知らないので調べるのにけっこう時間がかかる。もう少し経つときっとAIがこんな事したいと言っただけで勝手に書いてくれる時代になるとは思う。早くそうなって欲しい。
待っているだけだと時間の無駄なので受信した後のデータ処理を考えていた。処理と言ってもカンマ区切で1つの文字列になって入って来るのを分割する方法を。しかし、これがネットに例が出ていないので困った。分割で検索すると、確かに一連の文字列が分割されるが同じノードに出力されてしまうものばかり。
同じノードに出力されるとその下流のinfluxdb outではmeasurementが1つしか設定できないから全部同じところに値が入ってしまって具合が悪い。どうしても別のノードに出力させないといけない。
と、考えに考えてできたのが下記。
まず最初にはinjectノードでダミーのデータを送って分割してみた。

これはできた後だけれど、ここまでくるのにだいぶ時間がかかった。

ちゃんと異なるノードに分割されて出ているのがわかる。
これがinjectノードから送っている文字列。(数字をカンマ区切でいくつも送っている。)

まず文字列をカンマで分割。
もともとカンマ区切だけれどもカンマは区切文字でなくて単なる文字の1つと認識されているので正式に区切る。
区切ると1つ1つの文字(列)は出口が1つなので次々と下流のノードへ向かって出て行くだけ。

Splitから次々と出てきた文字(列)は一見数字に見えるが実は文字であって数字でないのでこれを計算のできる数字に変換する。変換は区切られた1個1個に対して行われる。

Splitでせっかく区切ったのだけれど、また1つの塊になるようにくっつける。くっつけると言っても、全く1つのものにするのではなくて配列にする。なぜなら、配列にしておいた方が個別より扱い易いから。

そしてここがメインのfunctionノード。
配列になっているのでその何番目かを指定して値を取出している。1つのfunctionで6つのうち1個だけ取り出すのでfunctionは6個必要になる。番号は0〜5。
注意しないといけないのは、msg.payloadをまず配列の変数に入れる事。その変数に[番号]を指定する事で1つ取り出せる。もう1つ大切なのはfunctionから出せるのは数字でも文字列でもないそうで、メッセージにそれを入れて出さないとエラーになる。

前回、数字で出力しようとしてエラーが出て、あっ文字列でないと...と思ったらそれは間違いで、「メッセージ」の形になっていると言うのが正しいとの事だった。
ここまで来たところで、実際のデータ受信モードに変更。
Injectionの代わりにmqttノードを設置。

出力側にinfluxdb outを設置。

全体像はこうなる。

しかし、Node-REDはコードを書かなくて良いからやるものなのだが、実際にはJavascriptを知らないとできない事もけっこう多いとわかった。changeとfunctionの中は、あれはコードとも言えない位にちょっとしたコードだけれど、知らないので調べるのにけっこう時間がかかる。もう少し経つときっとAIがこんな事したいと言っただけで勝手に書いてくれる時代になるとは思う。早くそうなって欲しい。
※コメント投稿者のブログIDはブログ作成者のみに通知されます