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カウントにリセット)
⑤先頭の”:”を削除
”:”で、データが分割されるため、下の2つが出力される。
・値:空
・値:03AA00810A78CB000000004E0008504C53310058000AAD
入力が、文字列になるので、配列は関係なし。
⑥空を出力しない
1 msg.payloadの値が、空欄の時、1側で出力される。
2 msg.payloadの値が、空欄以外の時、2側で出力される。
値が出力される2番目を次のフローへつなげる。
⑦1byteに分割
入力
値:03AA00810A78CB000000004E0008504C53310058000AAD
2文字(1byte)毎に分割して出力する。先頭から順番に出力されていく。
入力が、文字列になるので、配列は関係なし。
⑧振り分け
switch : 必要な値のみ 次へ出力する
プロパティ:msg.parts.index
1← value rules…==、型…文字列、値…0
2← value rules…==、型…文字列、値…18
3← value rules…==、型…文字列、値…19
4← value rules…==、型…文字列、値…21
Indexを使って、必要な値のみを選んで次へ出力する。
子機IDと送信時のパルスカウント数はここで完了。
Index:0 子機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が次へ出力される。
コメント