使用したもの
- ON・OFFスイッチ
- スマートプラグ
- ドングル
- Node-RedをインストールしたPC
使用したON・OFFスイッチはEnOceanのEWSSJを使用


使用したドングルはEnOceanのUSB 400Jを使用

使用したスマートプラグはTapoのP110Mを使用

前準備


- node-red-contrib-tapo-new-api
- node-red-node-serialport
この2種類を検索してノードを追加しておく。
TP-Link IDを作成してスマートプラグとペアリングしておく。

ドングルをUSBポートに挿し、デバイスマネージャーでポート情報を確認しておく。(画像の場合はCOM7)
使用するノード
使用するノードは、
- serial inノード
- switchノード
- changeノード
- actionsノード
- (debugノード)
の5種類を使用する。debugノードは必須ではないので省いても可。





配線図
以下のように配線する。各ノードのデータは後述する。

ノードのデータ
switchノードとchangeノードは複数あるため左から順に解説する。同じ列に同じ種類のノードがある場合は上から順に解説する。
フロー全体
[
{
"id": "3130bd6986cca7b0",
"type": "serial in",
"z": "5409fb978207031b",
"name": "",
"serial": "96f2625f9a00ab27",
"x": 90,
"y": 140,
"wires": [
[
"895098301574706d"
]
]
},
{
"id": "895098301574706d",
"type": "switch",
"z": "5409fb978207031b",
"name": "switch 1",
"property": "state",
"propertyType": "global",
"rules": [
{
"t": "istype",
"v": "boolean",
"vt": "boolean"
},
{
"t": "istype",
"v": "undefined",
"vt": "undefined"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 240,
"y": 140,
"wires": [
[
"6165cb8ada29367a"
],
[
"f185edd9e296e32a"
]
]
},
{
"id": "6165cb8ada29367a",
"type": "switch",
"z": "5409fb978207031b",
"name": "switch 2",
"property": "payload.11",
"propertyType": "msg",
"rules": [
{
"t": "eq",
"v": "0x84",
"vt": "str"
},
{
"t": "eq",
"v": "0x88",
"vt": "str"
}
],
"checkall": "true",
"repair": false,
"outputs": 2,
"x": 600,
"y": 140,
"wires": [
[
"ed7c835dcccc7897"
],
[
"6aac7487843ac160"
]
]
},
{
"id": "f185edd9e296e32a",
"type": "change",
"z": "5409fb978207031b",
"name": "change 1",
"rules": [
{
"t": "set",
"p": "state",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 400,
"y": 200,
"wires": [
[
"6165cb8ada29367a"
]
]
},
{
"id": "ed7c835dcccc7897",
"type": "switch",
"z": "5409fb978207031b",
"name": "switch 3_1",
"property": "state",
"propertyType": "global",
"rules": [
{
"t": "false"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 750,
"y": 120,
"wires": [
[
"20759605d65bf335"
]
]
},
{
"id": "6aac7487843ac160",
"type": "switch",
"z": "5409fb978207031b",
"name": "switch 3_2",
"property": "state",
"propertyType": "global",
"rules": [
{
"t": "true"
}
],
"checkall": "true",
"repair": false,
"outputs": 1,
"x": 750,
"y": 160,
"wires": [
[
"40eaf94775b9911e"
]
]
},
{
"id": "20759605d65bf335",
"type": "change",
"z": "5409fb978207031b",
"name": "change 2_1",
"rules": [
{
"t": "set",
"p": "state",
"pt": "global",
"to": "true",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 910,
"y": 120,
"wires": [
[
"2cd7f290576aa268"
]
]
},
{
"id": "40eaf94775b9911e",
"type": "change",
"z": "5409fb978207031b",
"name": "change 2_2",
"rules": [
{
"t": "set",
"p": "state",
"pt": "global",
"to": "false",
"tot": "bool"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 910,
"y": 160,
"wires": [
[
"41a8d316bf3ff50c"
]
]
},
{
"id": "754c3d42ff721c9a",
"type": "debug",
"z": "5409fb978207031b",
"name": "debug 1",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "result",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1380,
"y": 120,
"wires": []
},
{
"id": "7477b9cbb1540929",
"type": "debug",
"z": "5409fb978207031b",
"name": "debug 2",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "result",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1380,
"y": 160,
"wires": []
},
{
"id": "f6308bf9deb14a9d",
"type": "change",
"z": "5409fb978207031b",
"name": "change 3_1",
"rules": [
{
"t": "set",
"p": "result",
"pt": "msg",
"to": "Power ON",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1230,
"y": 120,
"wires": [
[
"754c3d42ff721c9a"
]
]
},
{
"id": "2ba03a5991d1911b",
"type": "change",
"z": "5409fb978207031b",
"name": "change 3_2",
"rules": [
{
"t": "set",
"p": "result",
"pt": "msg",
"to": "Power OFF",
"tot": "str"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 1230,
"y": 160,
"wires": [
[
"7477b9cbb1540929"
]
]
},
{
"id": "2cd7f290576aa268",
"type": "tapo_new_actions",
"z": "5409fb978207031b",
"name": "actions 1_1",
"deviceIp": "192.168",
"deviceAlias": "",
"deviceIpRange": "",
"searchMode": "ip",
"command": "on",
"version": "3",
"x": 1070,
"y": 120,
"wires": [
[
"f6308bf9deb14a9d"
]
]
},
{
"id": "41a8d316bf3ff50c",
"type": "tapo_new_actions",
"z": "5409fb978207031b",
"name": "actions 1_2",
"deviceIp": "192.168",
"deviceAlias": "",
"deviceIpRange": "",
"searchMode": "ip",
"command": "off",
"version": "3",
"x": 1070,
"y": 160,
"wires": [
[
"2ba03a5991d1911b"
]
]
},
{
"id": "96f2625f9a00ab27",
"type": "serial-port",
"name": "",
"serialport": "/dev/ttyUSB0",
"serialbaud": "57600",
"databits": 8,
"parity": "none",
"stopbits": 1,
"waitfor": "",
"dtr": "none",
"rts": "none",
"cts": "none",
"dsr": "none",
"newline": "100",
"bin": "bin",
"out": "time",
"addchar": "",
"responsetimeout": 10000
}
]
Code language: JSON / JSON with Comments (json)
serial inノード
シリアルポートを新規追加し、シリアルポートを検索する。前述した前準備で確認したポート番号と同じ項目を選択する。入力の分割方法を”タイムアウト後に区切る”に変更し、時間を”100ms”に変更する。分割後の配信データを”バイナリバッファ”に変更する。


その後、serial inノードとdebugノードを接続してデプロイする。用意したON・OFFスイッチを押して押されたときに出力されたメッセージを確認しておく。この作業をONとOFF両方で実行する。出力されたメッセージを比較して同じ番地で値が異なる部分を探し出す。ここでは11番地の値を参照し、ONの値が0x84(132)でOFFの値が0x88(136)であるためこれらの値を使用した。


actionsノード
actions 1_1
EmailとPasswordにTP-Link IDで登録したメールアドレスとパスワードを入力する。Commandを”ON (Turn on)”に変更する。Tapo ipaddressにスマートプラグのIPアドレスを入力する。IPアドレスの調べ方はTP-Link Tapoアプリを使用して調べる。

actions 1_2
Commandを”OFF (Turn off)”に変更し、それ以外は前述したactions 1_1と同様の設定に変更する。

changeノード
change 1
global変数を新たに作成し、そこに真偽値の”false”を代入する。ここでは例としてglobal.stateを作成した。

change 2_1
作成したglobal関数に真偽値”true”を代入する。

change 2_2
作成したglobal関数に真偽値”false”を代入する。

change 3_1(debugノードを使用する場合のみ)
debugノードに出力したい文字を入力する。ここでは例としてmsg.result変数を作成し、”Power ON”という文字を出力するようにした。

change 3_2(debugノードを使用する場合のみ)
debugノードに出力したい文字を入力する。ここでは例としてmsg.result変数を作成し、”Power OFF”という文字を出力するようにした。

switchノード
switch 1
作成したglobal変数を分岐させる。1つ目の条件はglobal変数が真偽値である場合、2つ目の条件がglobal変数が定義されていない場合である。

switch 2
ONを押したときとOFFを押したときで分岐する。ここでは、1つ目の条件がmsg.payload.11が0x84である場合、2つ目の条件がmsg.payload.11が0x88である場合である。

switch 3_1とshitch 3_2
前回の実行結果と同じ結果を繰り返さないためにglobal変数が分岐先と逆の値である場合のみ処理が進むようにする。(左がswitch 3_1、右がswitch3_2)


debugノード(出力が見たい場合のみ必須)
change 3_1やchange 3_2で作成した変数を出力するようにする。ここでは例としてmsg.resultを作成したため、msg.resultを出力するようにする。

実行手順
ノードのデータをすべて入力し終わったら、デプロイしてスイッチを操作するとスマートプラグが連動するようになる。また、debugノードをセットした場合はデバッグウィンドウに文字が出力される。
