Node-REDを使って、いままで他の手段で行っていたものを簡単にしてしまう記事の第2弾です。
今回は、MQTTでサブスクライブした値によってIFTTTに対応しているスマートプラグのON/OFFを制御するフローで、「CO2の濃度が高くなると換気扇を動かす」ような使い方を想定しています。
全体のフローはこんな感じです。
IFTTTとの連携に「node-red-contrib-ifttt」を追加しています。
ステップ1:MQTT入力(mqtt inノード)
まず、MQTTでサブスクライブ(購読)するトピックを指定します。
今回の例ではCO2 (room/co2)のトピックですが、温度や湿度など値が変化するものであれば同様に使用することができます。
ステップ2:値で分岐(switchノード)
次にスマートプラグをONにする閾値とOFFにする閾値を設定します。
この例のように、ONにする値とOFFにする値に幅を持たせておかないと動作が頻繁に起きてしまうので、注意して値を設定してください。
この例ではCO2を対象としているので幅を100にしています。
ステップ3:フラグで動作を制御(switchノード)
ここが今回のフローのポイントかもしれません。
このフローでは、値がONにする閾値以上になったかOFFにする閾値以下になった時に1回だけIFTTTにリクエストを出すようになっています。
この動作を実現させるために、プログラム言語の変数的な使い方ができるNode-REDのコンテキストを利用しています。
ここでは、このフロー内で有効なflagコンテキストを使って、閾値以上でflagがoffの時か、閾値以下でflagがonの時だけ、IFTTTにリクエストを出すようにしています。
ステップ4a:制御イベント送信(ifttt outノード)
IFTTTのWebhook (Maker Event) にイベントを送ります。
ここでは、onかoffをイベント名として送ります。
設定するKeyはIFTTTのWebhooks Settingsで確認することができます。
ステップ4b:フラグ変更(changeノード)
flagコンテキストをonの時にoff、offの時にonに変更します。
ここでflagを変更することで、値が閾値以上でflagがoffの時か閾値以下でflagがonの時に1度だけ、IFTTTにリクエストを出すことができます。
起動時:フラグ変更(injectノード)
ポイントの2つ目がこのノードです。
injectノードは起動時に実行することができるノードで、起動時にflagコンテキストをoffにしてIFTTTにoffリクセストを送信するトリガーに利用しています。
IFTTTの設定
IFTTTにはスマートプラグをONにするアプレットとOFFにするアプレットを作ります。
この例ではTP-LinkのTapo P105を使って、onイベントを受信したらTapo P105をONに、offイベントを受信したらTapo P105をOFFにするアプレットを作っています。