はじめに
要約
- Smartボタンを押したら、色々Smart家電を操作したい
モチベーション
- 我が家にはSmartな家電とAmazonEcho/GoogleHomeがあり、しゃべると家電が操作できる環境があります
- どんなものをつないで、どんな設定をしているかは関連記事を御覧ください
- しゃべれば動くのですが、毎回細かく伝えるのは無理があります
- オールONとかオールOFFはよいのですが、中途半端な状態だと面倒です
- ベッドに入りそろそろ寝るかという状態で、「alexa ○○ して」を何回も言うのは地味に面倒です
- スマートスピーカーは1つずつしか処理できませんので
- 毎回同じ状態なら定形フレーズにすればいいのですが、ライトを付ける/付けないなど毎回少しだけ違うのが、悩ましい。。。
- どこかにアナログなものを残したい所があって、ボタンって押したくなりますよね
関連する記事
実現方法
全体の連携イメージ
- SmartButton(Flic)を使って、照明/テレビ/エアコンを操作します
- クリック/ダブルクリック/ホールド(長押し)が使えるので、この3種類をそれぞれ割り当てます
- RaspberryPi上のNode-REDと(ライト以外)NatureRemoを使って、各家電を操作します
- ボタンを押して正しく動作したかわからないので、出力先としてGoogleNestHubに通知します
備考
- NatureRemoには各家電のリモコンが学習されている前提です
- 項番とはずれるのですが、わかりやすい順(処理のかんたんな順)で①->③->④->⑤->②の順に紹介します
①ボタンを押してNode-REDに通知する
- まず、SmartButtonはFlicを使います。
- Flicにはスマホを使うパターンとFlicHubを使うパターンの2つパターンがありどちらでもできます
- どちらでも設定自体はスマホで行います
- スマホアプリがありますので、インストールをして、ペアリングをします
- Flicにはスマホを使うパターンとFlicHubを使うパターンの2つパターンがありどちらでもできます
- 次に、スマホアプリでクリック/ダブルクリック/ホールド時の動作を定義します
- アプリは使いやすいですし、仕掛けられるイベントはたくさんあります
- 今回は汎用性を上げるために、WebHookで自宅のRaspberryPi上のNode-REDにつなぎます
③ダブルクリックでテレビをつける
フロー
- <サーバURL:PORT>/white_dbclickにGETメソッドで通知が来ると、NatureRemoのTokenを設定し、テレビ用のWebHookに通知します
重要な処理
RemoToken.js
msg.headers = {
"Content-Type":"application/x-www-form-urlencoded",
"accept" : "application/json",
"Authorization": "Bearer <省略>"
};
msg.payload = {
"button" : "power"
}
return msg;
- テレビ操作ノード
- メソッド:
POST
- URL :
https://api.nature.global/1/appliances/<ID>/tv
- メソッド:
備考
- テレビの場合は、
button=Power
で電源のON/OFFの両方ができるため、共通させています - テレビの電源の切り替えノード側のフローはGoogleNestHub通知用なので、後述します。
④ホールドでエアコンをつける
フロー
- テレビの場合に加えて、ON/OFFが個別になっていますが、それ以外は同じです
- 設定部分はフラグ管理用でON/OFFを交互に設定し、後続のswitchで処理を分けています
重要な処理
設定.js
var aircon_flag = flow.get("aircon_flag")|false;
aircon_flag = !aircon_flag;
flow.set("aircon_flag",aricon_flag);
return msg;
ON.js
msg.headers = {
"Content-Type":"application/x-www-form-urlencoded",
"accept" : "application/json",
"Authorization": "Bearer <省略>"
};
msg.payload = {
"button" : ""
}
return msg;
OFF.js
msg.headers = {
"Content-Type":"application/x-www-form-urlencoded",
"accept" : "application/json",
"Authorization": "Bearer <省略>"
};
msg.payload = {
"button" : "power-off"
}
return msg;
- エアコン操作ノード
- メソッド:
POST
- URL :
https://api.nature.global/1/appliances/<ID>/aircon_settings
- メソッド:
備考
- ONはbuttonが空文字ですが、OFFはbuttonがpower-offという非対称なので気をつけてください
- 通知先もairconではなく、aircon_settingsとテレビと少し異なります
⑤GoogleNestHubに通知する
フロー
- まず、事前に以下の方法で、GoogleNestHubのIPを調べます
- GoogleHomeアプリからGoogleNestHubを選択します
- 右上の歯車の設定をクリックします
- デバイス設定で、一番下の情報のIPアドレス:XXX.XXX.XXX.XXXを確認します
- 次にノードをインストールします
重要な処理
テレビの電源の切り替え.js
msg.payload.message = "テレビの電源を切り替えました" // TTS用の喋らせる文章
msg.payload.language = "ja" // 言語
- castノード
- IP:
上記で調べたIP
- Port:
8009(デフォルト)
- IP:
備考
- castノードには、音声ではなく画像を表示するなどカスタマイズパターンもあります
- 自分でわかってアクションを起こしているので、通知はいらないかも。。。
- NWやNode-REDなどでエラーになったときに気づけるので良いは良いのですが
②クリックで照明/ライトをつける
フロー
-
照明とライトの2つを制御します。両方ONは必要ないので3パターンを下記の通りローテーションします。
- 照明OFF/ライトON
- 照明ON/ライトOFF
- 照明OFF/ライトOFF
-
最初はtplink-smarthome-apiを入れて、jsでの実装を考えていのたですが、うまく行かなかったことと、これを使ったノードがあったので、以下をインストールしました
-
ただし、SmartライトのIPを調べるために、このライブラリは役立ちました
-
npm install tplink-smarthome-api
で入れた後に、tplink-smarthome-api search
で探せます- 他のやり方ともあると思いますが、スマホアプリからはIPを見つけられませんでしたので、一例として紹介いたします
-
重要な処理
tplinkのライト側のフロー
設定.js
var light_count = flow.get("light_count")||0;
light_count += 1;
if (light_count > 2) {light_count=0}
flow.set("light_count",light_count);
return msg;
ライトオン.js
msg.payload=true // ライトオフの場合はfalse
return msg;
- smartplugノード
- DeviceIP:
<上記で調べたIP>
- DeviceIP:
NatureRemoの照明側のフロー
ON.js
msg.headers = {
"Content-Type":"application/x-www-form-urlencoded",
"accept" : "application/json",
"Authorization": "Bearer <省略>"
};
msg.payload = {
"button" : "on" // OFFの場合はoff
}
return msg;
- 照明操作ノード
- メソッド:
POST
- URL :
https://api.nature.global/1/appliances/<ID>/light
- メソッド:
まとめ
-
今回は、SmartButton(Flic)を使って、照明/ライト&TV&エアコンを操作できるようにしました。
-
我が家でよくある「alexa 電気消して->alexa 照明つけて->alexa テレビ消して->alexa エアコン付けて」が、ボタンのクリック/ダブルクリック/ホールドの3連コンボになったので、一瞬になりました。
- alexaの返答を待たずに、連続でできるのがいいですね
# その他
- 認証情報などをハードコーディングしているしているため、ソースの公開ができません。すみません。。。