雑食エンジニアの気まぐれレシピ

日ごろ身に着けた技術や見知った知識などの備忘録的なまとめ.主にRaspberry Piやマイコンを使った電子工作について綴っていく予定.機械学習についても書けるといいな.

レオリモコンとAlexaを連携させる[Node-REDとAlexa連携]

今回はGoogleCloudPlatfotmでのNode-REDとAlexa連携についてです.正直書いたつもりで忘れてました.
下図で言うところの③ですね.これでAlexaとの連携についてのエントリはひとまず終了予定です.
f:id:shikky_lab:20180811060042p:plain
Node-REDは"入力"->"処理"->"出力"のフローをGUI上で作成することでコード不要で任意の動作を実行することができるツールです.IoT界隈では御用達らしいです.
これに"Node-RED Alexa Home Skill Bridge"というAlexaのからの入力をNode-RED用に変換してくれるサービスを併せることで, Alexaから任意の処理(今回の場合はレオリモコン操作)を実行することができます.
Node-RED日本ユーザ会
Node-RED Alexa Home Skill Bridge
なお基本的な内容は Amazon Echoで「○○をつけて」と言って家電を操作する - Qiita
様が非常に分かりやすくまとめてくださっているので触れません.
個人的に躓いたところなどをベースに書いていきたいと思います.

Node-REDの立ち上げ

いきなり躓きました.Node-REDはまずnodejsを入れる必要があるので
パッケージマネージャを利用した Node.js のインストール | Node.js
をもとにnodejs v10を入れて進めていたのですが,Node-REDのインストールに失敗し続けました.
結局原因はよくわからなったのですが,nodejs v8を入れると解決しました.若干のバージョン依存があったようです.
起動さえできればブラウザで接続するだけで,あとは非常に簡便なUIなのですんなりと作ることができました.

作成したフローについて

あまり語ることがないので,どんなフローを作成したのかいきなり出してしまいます.どん.

f:id:shikky_lab:20181222222823p:plain
Node-REDのフロー全体図
わー,大したことしてないのに大仰に見える.とりあえず
1. 定数宣言部分
2. 照明操作部分
3. エアコン操作部分
の3つに分けて説明します.

1. 定数宣言部分

f:id:shikky_lab:20181222223549j:plain
ここではフロー全体に影響する定数を宣言しています.あまり賢いやり方ではないので,ホントはもっと正しい方法があるような気がしてます...
右側のConstants関数の中身は↓となっています.

global.set("target_address","192.168.X.X");
global.set("target_port","XXXX");

node-redのグローバル変数はプログラムを起動中は消えないため,変更した際に手動で左側のSetConsutantsを発火させておけば,以降デプロイしなおしても変更内容は維持されます.
ただプログラムを再起動した際は手動で叩きなおす必要があります.めんどい.まぁそんな機会はめったにないので妥協しました.

2.照明操作部分

f:id:shikky_lab:20181222224624p:plain 一番左のlightノードが"Node-RED Alexa Home Skill Bridge"のノードとなります.Home Skill Bridgeにてlightデバイスを作成して,Alexaにスマートホームバイスとして登録しておくと,Alexaからこのノードを発火することができます.
さて,レオパレスに備え付けられた照明はなぜか無駄に多機能なので,Home Skill Bridgeでのデバイスは以下のように作りました.
f:id:shikky_lab:20181222225228p:plain 通常のON/OFFのほか,明るさと色温度の変更ができます.
受け取ったシグナルは次のSwitchノードで機能ごとにフローを分岐します.これはmsg.commandの中身を見ることで以下のように分岐できます.
f:id:shikky_lab:20181222225755p:plain
ただ,このあとのフローを見ればわかるように,全然実装してません.明度とか色温度とか普通変えないし・・・・・・
なので電気のON/OFFはそのままに,それ以外の明るさの指定があった場合は"メモリーした明度"に切り替える指定にしています. 最後の実行部分は
shikky-lab.hatenablog.com
で作ったコマンドをFlaskでRest APII化したものを以下のように叩いています. f:id:shikky_lab:20181222231744p:plain
あれ,さっき宣言した定数使ってない・・・・・・
さっきの変数はエアコン設定側の時に追加したので忘れてました...

あ,ちなみに二つ目のSwitchノードは明るさ指定の値を見て,100%の時だけ全灯に切り替えています.

3.エアコン操作部分

f:id:shikky_lab:20181222233632p:plain こちらは入力を「冷房」と「暖房」に切り分けています.操作するのは一つのエアコンなのですが,こうすることで操作を切り替えることができます.
エアコンの操作は
http://X.X.X.X/cooler?value=26
のようにパラメータで温度を指定できるようにしているので,"createURIWithNumber"ノードで以下のようにURIを構築しています.

msg.payload =  global.get("target_address")+":"+global.get("target_port")+"/"+msg.name +"?"+ "value="+msg.payload
return msg;

こうすることでcoolerでもheaterでも同じフローで流すことができます.

おわりに

はてさて,これにてAlexa連携についてのご紹介はひと段落とします.えらい間が空いてしまった...
FlaskでRestAPIとかさらりと流しましたが,あまり面白いことできてないのでうまく記事にできそうになく...
ただレオリモコンの公式アプリが非常に使いづらいので,そのあたりをWebアプリとして自作できないかと画策中です.そのあたりが形になったらFlaskの話もそこでできたらと思います.
それでは.