Node-RED:TWELITE PAL PulseCounterからの受信データからカウント数を抽出

HEMS/IoT
スポンサーリンク

TWELITE PAL のPulseCounterから送信されたデータから、カウントされたパルス数と送信回数を抽出するまでのNode-REDのNodeフローの中身の詳細

Nodeフロー全体

①②③:欲しいデータ。
④:受信データの取得
⑤~⑩:受信データの処理

”Serial In” Nodeを 使用するが、下記Nodeを追加されていない場合は、
事前に追加しておく必要がある。
追加するNode名:node-red-node-serialport

追加方法は、下記リンク先に記載している 
Node(ノード)を追加

[{"id":"4cba5a73.e48a74","type":"split","z":"4f152cc7.ef81f4","name":"\":\" 削除","splt":":","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":260,"y":140,"wires":[["d3ce553c.8274c8"]]},{"id":"d3ce553c.8274c8","type":"switch","z":"4f152cc7.ef81f4","name":"空を出力しない","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"","vt":"str"},{"t":"neq","v":"","vt":"str"}],"checkall":"true","repair":false,"outputs":2,"x":420,"y":140,"wires":[[],["6458b9f6.f599a8","fefcfe92.d5961"]]},{"id":"6458b9f6.f599a8","type":"debug","z":"4f152cc7.ef81f4","name":"\":\" 削除 44桁","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":620,"y":140,"wires":[]},{"id":"fefcfe92.d5961","type":"split","z":"4f152cc7.ef81f4","name":"1 byte 分割","splt":"2","spltType":"len","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":130,"y":220,"wires":[["f44672c.b195d9","b2d2d087.2190f"]]},{"id":"f44672c.b195d9","type":"debug","z":"4f152cc7.ef81f4","name":"No.2","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"parts.index","targetType":"msg","x":150,"y":260,"wires":[]},{"id":"b2d2d087.2190f","type":"switch","z":"4f152cc7.ef81f4","name":"振り分け ","property":"parts.index","propertyType":"msg","rules":[{"t":"eq","v":"0","vt":"str"},{"t":"eq","v":"18","vt":"str"},{"t":"eq","v":"19","vt":"str"},{"t":"eq","v":"21","vt":"str"}],"checkall":"true","repair":false,"outputs":4,"x":300,"y":220,"wires":[["2b4ffd2e.86d8c2"],["82ca66ed.42b7e8"],["82ca66ed.42b7e8"],["dfe7208d.149ca"]]},{"id":"2b4ffd2e.86d8c2","type":"debug","z":"4f152cc7.ef81f4","name":"子機のID","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":600,"y":180,"wires":[]},{"id":"dfe7208d.149ca","type":"debug","z":"4f152cc7.ef81f4","name":"送信時のパルスカウント数","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":560,"y":260,"wires":[]},{"id":"82ca66ed.42b7e8","type":"join","z":"4f152cc7.ef81f4","name":"","mode":"custom","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"num","reduceFixup":"","x":430,"y":220,"wires":[["6c2685c4.0009fc"]]},{"id":"f8e8d14b.928a6","type":"comment","z":"4f152cc7.ef81f4","name":"ガスメーターのパルスカウント","info":"","x":150,"y":60,"wires":[]},{"id":"75780a1f.3f8914","type":"debug","z":"4f152cc7.ef81f4","name":"送信回数","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":740,"y":220,"wires":[]},{"id":"6c2685c4.0009fc","type":"function","z":"4f152cc7.ef81f4","name":"16進数→10進数","func":"var hex = msg.payload; //変数 hex に msg.payload の値を代入\nmsg.payload = parseInt(hex, 16); //parseInt関数で10進数に変換後、payloadに値を代入\nreturn msg;","outputs":1,"noerr":0,"x":580,"y":220,"wires":[["75780a1f.3f8914"]]},{"id":"a9675160.ca3cc","type":"serial in","z":"4f152cc7.ef81f4","name":"","serial":"8240e048.32f09","x":90,"y":140,"wires":[["4cba5a73.e48a74"]]},{"id":"d1729c28.94e16","type":"comment","z":"4f152cc7.ef81f4","name":"受信データより抽出(ID,送信回数,カウント数)","info":"","x":200,"y":100,"wires":[]},{"id":"8240e048.32f09","type":"serial-port","z":"","serialport":"/dev/ttyUSB0","serialbaud":"115200","databits":"8","parity":"none","stopbits":"1","waitfor":"","newline":"\\n","bin":"false","out":"char","addchar":"","responsetimeout":"10000"}]

①②③欲しいデータ

①子機のID:複数の子機を扱う場合、識別するためにIDを振り分けておく必要がある。
 割り当てられるIDは、0x01~0x64(1~100)。”0x”は、16進数であることを示す。

②送信時のパルスカウント数:PulseCounterが送信した際のパルスカウント数。
 データ送信後にカウント数はリセットされる。
 PulseCounterのコード 57行目の”**// 1 count to wakeup”の**に設定した値のカウント数まで、パルスを受信後、TWELITE PAL は起床して、データ送信を実行するという動作を行う。
 データ送信時のパルスカウント数を送信している。
 パルスカウント数は、データ送信後に0カウントにリセットされる。

③送信回数:PulseCounterがデータ送信した回数
 0~65535までの回数をカウントできる。

②③が必要な理由は、
送信時のパルスカウント数が必要な理由:**の設定値と受信データの値が一致しないことがある。
 この
送信回数が必要な理由は、受信を失敗することが稀に発生することがある。受信できなかった分は補正する必要がある。

ひと月でどの程度の誤差が発生するか、上記エラーを拾っておいて、補正できるようにできたらと考えている。

④MONOSTICK 受信データの取得

serial in :MONOSTICKを挿しているUSBを指定
🔍で検索
シリアルポート…/dev/ttyUSB0
※ttyUSB# が複数ある場合、調べる必要がある
数値の修正
ポートレート…115200

設定後、デプロイをしてもNode下の表記が接続済にならないことがあるが、
TWELITE PALからデータを受信すると接続済となる。

受信データ
:03AA00810A78CB000000004E0008504C53310058000AAD

抽出するデータ
03:子機のID 識別用
0058:TWELITE PALの送信回数 16進数(0001~FFFF)
0A:パルスカウント数(データ送信時。送信後0カウントにリセット)

⑤先頭の”:”を削除

split : 先頭の”:”を削除
文字列/バッファ 分割 
型…文字列 値… :

”:”で、データが分割されるため、下の2つが出力される。
・値:空
・値:03AA00810A78CB000000004E0008504C53310058000AAD

入力が、文字列になるので、配列は関係なし。

⑥空を出力しない

switch : 値:空を出力しないようにする
← value rules…==、型…文字列、値…空欄
← value rules… !=、型…文字列、値…空欄

 msg.payloadの値が、空欄の時、1側で出力される。
 msg.payloadの値が、空欄以外の時、2側で出力される。

値が出力される2番目を次のフローへつなげる。

⑦1byteに分割

split : 文字列のデータを2文字毎に分割
文字列/バッファ 分割 
 型…固定長 値…2

入力
値:03AA00810A78CB000000004E0008504C53310058000AAD
2文字(1byte)毎に分割して出力する。先頭から順番に出力されていく。

入力が、文字列になるので、配列は関係なし。

⑧振り分け

switch : 必要な値のみ 次へ出力する
プロパティ:msg.parts.index
← value rules…==、型…文字列、値…0
← value rules…==、型…文字列、値…18
← value rules…==、型…文字列、値…19
← value rules…==、型…文字列、値…21

Indexを使って、必要な値のみを選んで次へ出力する。
子機IDと送信時のパルスカウント数はここで完了。
Index: 子機ID
Index:18、19 送信回数
Index:21 送信時のパルスカウント数

⑨送信回数を結合(JOIN)

join : 送信回数 2つを結合する
出力…文字列
メッセージ送信:指定数のメッセージパーツを受信後…2

2つ受信した時点で結合して、次へ出力。
Index:18、19 送信回数 の2つを結合して、2byteデータにする。
 Index:18 値…00
 Index:19 値…58
出力データの値…0058

⑩16進数→10進数 変換

fanction : 16進数を10進数に変換

var hex = msg.payload;
msg.payload = parseInt(hex, 16);
return msg;

Javascript で16進数を10進数に変更するためのコードを記述。

var hex = msg.payload;
 変数の宣言と変数 ”hex” に msg.payload の値を代入

msg.payload = parseInt(hex, 16);
 parseInt関数で10進数に変換後、msg.payloadに値を代入
 paeseInt関数は、

return msg;
 msgは、msg.payloadのこと。
 変更されたmsg.payloadが次へ出力される。

戻る:WELITE:ガスメーターのパルス発信をカウントして、ガス使用量を計測する

コメント