Raspberry PiにNode-Redを導入すると、簡単にシリアル通信を行えます。
シリアル通信ができるということは、USBにシリアルポートが乗っかっているこんなのも動かせるということです。
Raspberry Piに挿してスマート電力量メーターから家の消費電力を読んだりできたりする奴です。
多くの先達の方々のお知恵とおコードを拝借することで、私のRaspberry Piにもなんとか導入することができました。
今回は、手元にあるHEMS用 Wi-SUNモジュール RL7023(以下、HEMS)をRaspberry Piに挿してNode-Redのシリアル通信を使い、スマート電力量メーターと通信して瞬間電力を取得するところまでやってみます。
なお、次の記事などを参考にさせていただきました。
通信仕様であるECHONET Liteの規格書はこちらです。
アプリケーション通信インターフェース仕様書 > 低圧スマート電力量メータ・HEMSコントローラ間
HEMS機器の安易な取り扱いやデータの読み間違いは意図しない重大な結果につながるので要注意です。
目次
1.必要なもの
2.シリアル通信をためす
3.フローの説明
4.実行してみる
5.おわりに
1. 必要なもの
- HEMS用 Wi-SUNモジュール RL7023
- Raspberry Pi
- Node-Red
- 電力会社に発行してもらったBルートのIDとパスワード
2. シリアル通信をためす
serialportノードのインストール
まずは、Node-Redにserialportノードをインストールします。
右上のハンバーガー > パレットの管理 > ノードを追加でnode-red-node-serialport
を検索、追加します。
インストールできたら左側のパレットにserialportノードが追加されています。
serialportノードを使ってみる
こんな感じに組み立てます。
"SKVER"injectノード
このノードのプロパティです。
文字列"SKVER"を作ります。
"payload & "\r""changeノード
上流から来るコマンド文字列にコントロール文字"\r"を付加するノードです。
"HEMSシリアル OUT"serial outノード
HEMSにシリアル送信を行うノードです。
固有名をHEMSシリアル OUT
に変えてあります。
鉛筆ボタンを押して新しくプロパティを作ります。
"HEMSシリアル IN"serial inノード
HEMSからシリアル受信を行うノードです。
プロパティは"HEMSシリアル OUT"ノードで設定したものを選択します。
debug
ノード
上流から流れてくるmsg.payload
、つまりHEMSの吐き出すレスポンスを受けて、デバッグ欄に表示します。
実行
ではこのフローを実行してみましょう。
デプロイして、injectノードのボタンを押します。
Pythonでの結果と同じになりました。
こんな感じで最後までコマンドを並べていきます。
3. フローの説明
完成形
上から順にフローを説明します。
なお、"HEMSシリアル IN"ノードと"HEMSシリアル OUT"ノードは前述のものをそのまま使います。
なお、このフローはPythonプログラムのコードやログを参考にして作ったハリボテのようなものなので、違う環境ではうまく作動しないかもしれません。たとえば、本来ならコマンドの戻り値から取得すべき電力量の桁数を勝手に固定したりしています。
"ここにプロパティを設定する"injectノード
電力会社が発行したBルートのIDとパスワードをここに入力します。
"ローカル変数 to フロー変数"changeノード
上のノードで設定したIDとパスワードを、このタブ内をスコープとするフロー変数に代入します。
"SKSETPWD C **********"injectノード
Bルートのパスワードをセットするコマンド文字列を作ります。
パスワードはフロー変数に代入した文字列を使います。
"SKSETRBID ********************************"injectノード
同じくBルートのIDをセットするコマンド文字列を作ります。
"SKSCAN 2"injectノード群
各ノード名のコマンド文字列を作ります。
名前と中身は同じです。
"SKSREG S2 **"injectノード
"SKSCAN 2"ノード群のコマンドのレスポンスに含まれる" Channel:"に続く文字列を使い、コマンド文字列を作ります。
"SKSREG S3 ****"injectノード
"SKSCAN 2"ノード群のコマンドのレスポンスに含まれる" Pan ID:"に続く文字列を使い、コマンド文字列を作ります。
"SKLL64 ****************"injectノード
"SKSCAN 2"ノード群のコマンドのレスポンスに含まれる" Addr:"に続く文字列を使い、コマンド文字列を作ります。
"SKJOIN :::::::"injectノード
"SKLL64 ****************"ノードのコマンドのレスポンスに含まれるIPv6アドレス文字列を使い、コマンド文字列を作ります。
"ipv6Addr"injectノード
"SKLL64 ****************"ノードのコマンドのレスポンスに含まれるIPv6アドレス文字列を使い、コマンド文字列を作ります。
"SKSENDTO"functionノード
//"SKSENDTO 1 "
var buf1 = Buffer.from("SKSENDTO 1 ",'ascii');
//ipv6Addr
var buf2 = Buffer.from(msg.ipv6Addr,'ascii');
//" 0E1A 1 000E "
var buf3 = Buffer.from(" 0E1A 1 000E ",'ascii');
//echonetLiteFrame
var buf4 = new Buffer([16,129,0,1,5,255,1,2,136,1,98,1,231,0]);
//結合
msg ={payload: Buffer.concat([buf1,buf2,buf3,buf4])};
return msg;
"SKSENDTO"コマンドを組み立てます。
このコマンドだけは、文字列+バイナリの組み合わせなので、文字列の部分を一度バイナリに変換してから結合します。
"HEMSシリアル OUT(binary)"serial outノード
SKSENDTOはバイナリとして送信するので、バイナリ用のserial outノードを用意します。
プロパティもバイナリ用にします。
ここで、自動で付与されるプロパティ名が前のものと同じになってしまい、順番でしか区別できなくなってしまいました。
これが原因なのかは分かりませんが、バイナリで送ったはずが文字列で届いたりその逆になったりすることがあります。そのようなときは、Raspberry Piを再起動すれば直ります。
(追記)最初からシリアル送受信を素直にバイナリで統一すればいいだけですね。
"戻り値?"switchノード
HEMSが返す戻り値に応じて出力先ノードを分岐させます。
changeノード群
コマンドを構成するのに必要な目的の文字列を抽出し、フロー関数に代入しているだけです。
なお、うちの環境では、channel以外の文字列は毎回同じです。
"プロパティがセットされました"changeノード
フロープロパティのセットを通知する文字列を作ります。
"ERXUDP type E7?"switchノード
"ERXUDP"に続く所定の位置に戻り値"E7"(瞬間電力に対応する)が含まれている場合に処理を続行します。
"E7 瞬間電力"changeノード
バイナリを文字情報に整形します。
4. 実行してみる
一番上の"ここにプロパティを設定する"ノードから、一番下の"ipv6Addr"ノードまで、順次injectノードのボタンを押していきます。
ボタンを押すたびに、"OK"や"EVENT"などの文字列が、デバッグサイドバーに流れてくるはずです。
最後の"ipv6Addr"injectノードを押すと、
瞬間電力が表示されました。ゴール。
5. おわりに
Node-Redなので、グラフ化するなりGoogle Homeに電気の使い過ぎを叱らせるなり簡単にできますね。
今回作ったフローは下に置いておきます。
HEMSフロー(折りたたみ)
[
{
"id": "49beefd0eaaf4a6a",
"type": "tab",
"label": "HEMS",
"disabled": false,
"info": "",
"env": []
},
{
"id": "4004cb5a58699790",
"type": "group",
"z": "49beefd0eaaf4a6a",
"name": "送信",
"style": {
"label": true
},
"nodes": [
"2676c4e4fe9a5cda",
"088e6715e70f860b",
"4298251172f4c4c3",
"568a2a591ea46393",
"f98f4db8cd3fa410",
"04ba53300916f691",
"fb0ec04ac6017b63",
"b5b896577e1dfb6e",
"bd3b1ed9c465bd25",
"a3676484db745daf",
"1b2d3525c7d2b087",
"586161e167f95ec3",
"121e6c6caf8f860d",
"a907cc6497817aba",
"f71e06ec28f4697e",
"540cf633b17078cf",
"cbd2a4b12cf35653",
"f537dfd40e07e6bd"
],
"x": 14,
"y": 139,
"w": 712,
"h": 622
},
{
"id": "c4ce45e52323bd56",
"type": "group",
"z": "49beefd0eaaf4a6a",
"name": "受信",
"style": {
"label": true
},
"nodes": [
"ddf19b92b483e25e",
"ab5a9c17d4c8836b",
"503cce7c41dea089",
"d2e6294be1e3a289",
"654ef31eb665b02f",
"6c3fa15c620fc0f9",
"929eac3f8def68a5",
"c808eac7e16ce186",
"b3e040a515863bd0",
"346d61d741e5286d",
"96f4a4f19d93331a",
"cf825221ed020904",
"39362c73fd180a16"
],
"x": 14,
"y": 779,
"w": 712,
"h": 422
},
{
"id": "2676c4e4fe9a5cda",
"type": "serial out",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "HEMSシリアル OUT",
"serial": "92c4fb6c.c8bcd8",
"x": 600,
"y": 180,
"wires": []
},
{
"id": "088e6715e70f860b",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKVER",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "SKVER",
"payloadType": "str",
"x": 110,
"y": 180,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "4298251172f4c4c3",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "payload & \"\\r\"",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "payload & \"\\r\"",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 450,
"y": 420,
"wires": [
[
"2676c4e4fe9a5cda",
"f71e06ec28f4697e"
]
]
},
{
"id": "568a2a591ea46393",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKSETPWD C **********",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "\"SKSETPWD C \" & $flowContext(\"pwd\")",
"payloadType": "jsonata",
"x": 160,
"y": 220,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "f98f4db8cd3fa410",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKSETRBID ********************************",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "\"SKSETRBID \" & $flowContext(\"rbid\")",
"payloadType": "jsonata",
"x": 210,
"y": 260,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "04ba53300916f691",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "SKSCAN 2 FFFFFFFF 4",
"payloadType": "str",
"x": 180,
"y": 360,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "fb0ec04ac6017b63",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "SKSCAN 2 FFFFFFFF 5",
"payloadType": "str",
"x": 180,
"y": 400,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "b5b896577e1dfb6e",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "SKSCAN 2 FFFFFFFF 6",
"payloadType": "str",
"x": 180,
"y": 440,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "bd3b1ed9c465bd25",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKSREG S2 **",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "\"SKSREG S2 \" & $flowContext(\"channel\")",
"payloadType": "jsonata",
"x": 140,
"y": 500,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "a3676484db745daf",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKSREG S3 ****",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "\"SKSREG S3 \" & $flowContext(\"panid\")",
"payloadType": "jsonata",
"x": 140,
"y": 540,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "1b2d3525c7d2b087",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKLL64 ****************",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "\"SKLL64 \" & $flowContext(\"addr\")",
"payloadType": "jsonata",
"x": 160,
"y": 580,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "586161e167f95ec3",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKJOIN ****:****:****:****:****:****:****:****",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "\"SKJOIN \" & $flowContext(\"ipv6addr\")",
"payloadType": "jsonata",
"x": 210,
"y": 620,
"wires": [
[
"4298251172f4c4c3"
]
]
},
{
"id": "121e6c6caf8f860d",
"type": "comment",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "以下3個のどれかで\"EVENT 20\"が出ればよい。(時間がかかる)",
"info": "",
"x": 270,
"y": 320,
"wires": []
},
{
"id": "a907cc6497817aba",
"type": "serial out",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "HEMSシリアル OUT(binary)",
"serial": "5205cde260160cea",
"x": 475,
"y": 660,
"wires": [],
"l": false
},
{
"id": "f71e06ec28f4697e",
"type": "debug",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 630,
"y": 220,
"wires": []
},
{
"id": "540cf633b17078cf",
"type": "debug",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 630,
"y": 720,
"wires": []
},
{
"id": "cbd2a4b12cf35653",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "ipv6Addr",
"props": [
{
"p": "ipv6Addr",
"v": "$flowContext(\"ipv6addr\")",
"vt": "jsonata"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 120,
"y": 660,
"wires": [
[
"f537dfd40e07e6bd"
]
]
},
{
"id": "f537dfd40e07e6bd",
"type": "function",
"z": "49beefd0eaaf4a6a",
"g": "4004cb5a58699790",
"name": "SKSENDTO",
"func": "//\"SKSENDTO 1 \"\nvar buf1 = Buffer.from(\"SKSENDTO 1 \",'ascii');\n\n//ipv6Addr\nvar buf2 = Buffer.from(msg.ipv6Addr,'ascii');\n\n//\" 0E1A 1 000E \"\nvar buf3 = Buffer.from(\" 0E1A 1 000E \",'ascii');\n\n//echonetLiteFrame\nvar buf4 = new Buffer([16,129,0,1,5,255,1,2,136,1,98,1,231,0]);\n\n//結合\nmsg ={payload: Buffer.concat([buf1,buf2,buf3,buf4])};\n\nreturn msg;",
"outputs": 1,
"noerr": 0,
"initialize": "",
"finalize": "",
"libs": [],
"x": 310,
"y": 660,
"wires": [
[
"a907cc6497817aba",
"540cf633b17078cf"
]
]
},
{
"id": "3bd5c618626c1fdf",
"type": "inject",
"z": "49beefd0eaaf4a6a",
"name": "ここにプロパティを設定する",
"props": [
{
"p": "rbid",
"v": "IDBルートのID",
"vt": "str"
},
{
"p": "pwd",
"v": "Bルートのパスワード",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 180,
"y": 100,
"wires": [
[
"b8a00d9096f95b6c"
]
]
},
{
"id": "2668e4f95c526673",
"type": "debug",
"z": "49beefd0eaaf4a6a",
"name": "",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 630,
"y": 100,
"wires": []
},
{
"id": "b8a00d9096f95b6c",
"type": "change",
"z": "49beefd0eaaf4a6a",
"name": "ローカル変数 to フロー変数",
"rules": [
{
"t": "set",
"p": "rbid",
"pt": "flow",
"to": "rbid",
"tot": "msg"
},
{
"t": "set",
"p": "pwd",
"pt": "flow",
"to": "pwd",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 440,
"y": 100,
"wires": [
[
"2668e4f95c526673"
]
]
},
{
"id": "088f905780f0c11b",
"type": "comment",
"z": "49beefd0eaaf4a6a",
"name": "上のinjectノードから順に押す",
"info": "",
"x": 140,
"y": 40,
"wires": []
},
{
"id": "ddf19b92b483e25e",
"type": "serial in",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "HEMSシリアル IN",
"serial": "92c4fb6c.c8bcd8",
"x": 130,
"y": 820,
"wires": [
[
"ab5a9c17d4c8836b",
"929eac3f8def68a5"
]
]
},
{
"id": "ab5a9c17d4c8836b",
"type": "debug",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 610,
"y": 820,
"wires": []
},
{
"id": "503cce7c41dea089",
"type": "debug",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 610,
"y": 1160,
"wires": []
},
{
"id": "d2e6294be1e3a289",
"type": "switch",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "ERXUDP type E7?",
"property": "type",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "E7",
"vt": "str"
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 230,
"y": 1160,
"wires": [
[
"6c3fa15c620fc0f9"
],
[]
],
"outputLabels": [
"E7",
""
]
},
{
"id": "654ef31eb665b02f",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "ERXUDP",
"rules": [
{
"t": "set",
"p": "type",
"pt": "msg",
"to": "$substring(payload,145,2)",
"tot": "jsonata"
},
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "$substring(payload,149)",
"tot": "jsonata"
},
{
"t": "set",
"p": "byte",
"pt": "msg",
"to": "$substring(payload,147,2)",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 320,
"y": 880,
"wires": [
[
"d2e6294be1e3a289"
]
]
},
{
"id": "6c3fa15c620fc0f9",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "E7 瞬間電力",
"rules": [
{
"t": "set",
"p": "watt",
"pt": "msg",
"to": "$parseInteger($string(\"0x\"&payload),'0')",
"tot": "jsonata"
},
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "\"E7 瞬間電力 \"& watt &\" [W]\"",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 430,
"y": 1160,
"wires": [
[
"503cce7c41dea089"
]
]
},
{
"id": "929eac3f8def68a5",
"type": "switch",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "戻り値?",
"property": "payload",
"propertyType": "msg",
"rules": [
{
"t": "cont",
"v": "ERXUDP",
"vt": "str"
},
{
"t": "cont",
"v": " Channel:",
"vt": "str"
},
{
"t": "cont",
"v": " Pan ID:",
"vt": "str"
},
{
"t": "cont",
"v": " Addr:",
"vt": "str"
},
{
"t": "regex",
"v": "^....:....:....:....:....:....:....:....\\r\\n$",
"vt": "str",
"case": false
},
{
"t": "else"
}
],
"checkall": "true",
"repair": false,
"outputs": 6,
"x": 140,
"y": 940,
"wires": [
[
"654ef31eb665b02f"
],
[
"346d61d741e5286d"
],
[
"b3e040a515863bd0"
],
[
"96f4a4f19d93331a"
],
[
"c808eac7e16ce186"
],
[]
]
},
{
"id": "c808eac7e16ce186",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "ipv6addr",
"rules": [
{
"t": "set",
"p": "ipv6addr",
"pt": "flow",
"to": "$substringBefore(msg.payload,\"\\r\\n\")",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 500,
"y": 1040,
"wires": [
[
"39362c73fd180a16"
]
]
},
{
"id": "b3e040a515863bd0",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": " Pan ID:",
"rules": [
{
"t": "set",
"p": "panid",
"pt": "flow",
"to": "$substring(payload,9,4)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 500,
"y": 960,
"wires": [
[
"39362c73fd180a16"
]
]
},
{
"id": "346d61d741e5286d",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": " Channel:",
"rules": [
{
"t": "set",
"p": "channel",
"pt": "flow",
"to": "$substring(payload,10,2)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 500,
"y": 920,
"wires": [
[
"39362c73fd180a16"
]
]
},
{
"id": "96f4a4f19d93331a",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": " Addr:",
"rules": [
{
"t": "set",
"p": "addr",
"pt": "flow",
"to": "$substring(payload,7,16)",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 490,
"y": 1000,
"wires": [
[
"39362c73fd180a16"
]
]
},
{
"id": "cf825221ed020904",
"type": "debug",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 610,
"y": 1100,
"wires": []
},
{
"id": "39362c73fd180a16",
"type": "change",
"z": "49beefd0eaaf4a6a",
"g": "c4ce45e52323bd56",
"name": "\"プロパティがセットされました\"",
"rules": [
{
"t": "set",
"p": "payload",
"pt": "msg",
"to": "\"プロパティがセットされました \" & msg.payload",
"tot": "jsonata"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 380,
"y": 1100,
"wires": [
[
"cf825221ed020904"
]
]
},
{
"id": "92c4fb6c.c8bcd8",
"type": "serial-port",
"serialport": "/dev/ttyUSB0",
"serialbaud": "115200",
"databits": "8",
"parity": "none",
"stopbits": "1",
"waitfor": "",
"dtr": "none",
"rts": "none",
"cts": "none",
"dsr": "none",
"newline": "\\n",
"bin": "false",
"out": "char",
"addchar": "",
"responsetimeout": "1000"
},
{
"id": "5205cde260160cea",
"type": "serial-port",
"serialport": "/dev/ttyUSB0",
"serialbaud": "115200",
"databits": "8",
"parity": "none",
"stopbits": "1",
"waitfor": "",
"dtr": "none",
"rts": "none",
"cts": "none",
"dsr": "none",
"newline": "100",
"bin": "bin",
"out": "time",
"addchar": "",
"responsetimeout": "10000"
}
]