Intern

ON・OFFスイッチとスマートプラグを連携させる

使用したもの

  • 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ノードをセットした場合はデバッグウィンドウに文字が出力される。