AmazonのEcho!早く日本でも発売して欲しいですよね。米国のAmazon.comでechoを買おうとすると「This item does not ship to Tokyo, Japan. 」って表示されるんですよ。
ぼくは発売を待っていることができずに、なんとかAlexaが使える方法を探していました。
最初に見つけたのが「alexa-avs-sample-app」です。Amazonが開発者にAlexaを使ってもらうために用意したサンプルアプリです。Raspberry PiにインストールしてちょっとAlexaとお喋りしたあと、本命の機器制御を行おうと思ったらなんと機器制御はサポートされてなかったんです。せっかくUSBマイクを買ったのに!
悲嘆に暮れながらもめげずにGoogle先生に相談していたら、なんと、わざわざプログラムをインストールしなくてもブラウザからAlexaを使えるサービスがあったんです!
Echosim.io
それがEchosim.ioの「Alexa Skill Testing Tool」です。
Echosim.ioはAmazon.comのアカウントがあれば利用可能で、Echoで行えることは全て行えるみたいです。政治的な理由かはわかりませんが、Chromeとは相性が悪くFirefoxだとPCでもAndroidでも動きます。そう、スマホでも使えるのでわざわざマイクを用意する必要が無かったんです!ガーン!
Amazon Alexa
Amazonが用意しているAlexa用のサイトではEchosim.ioはこのように出ます。ちなみにこのサイトもAmazon.comのアカウントが必要です。
上のWelcome!の「Customize Alexa」か [Settings]メニューの[Devices]でデバイスを選ぶと「General」と「Measurement Units」でタイムゾーンの設定と温度と距離の単位をメートル法に設定できるので、Alexaに時刻を聞くと日本時間で答えてくれて、温度を摂氏で、距離をメートルで答えてくれるようになります。
Black Bean(黒豆)ことBroadlink RM Mini 3
Black BeanはWiFiに対応した赤外線学習リモコンで、LAN内だけでなく屋外からでもスマホアプリから機器をコントロールすることができます。他にもこのような製品は存在していますが、Black Beanの特徴はその安さです。中国の通販サイトで送料無料で1,600円ぐらいで買うことができ、屋外からでも追加料金なく利用できます。ただ、このサイトで購入すると商品が届くのに1ヶ月くらいかかるため、気の短い人には向きません。
Black BeanはAmazon Echoに対応していないため、そのままではAlexaからコントロールすることができません。なんとかできないかとかなり長い間Google先生に相談して、次の2つのツール(サービス)を組み合わせればできそうだという感触を得たので、早速やってみることにしました。
動画はリビグンで撮影したため機器構成が異なっていますが、仕組みは一緒です。
Python control for Broadlink RM2 IR controllers (python-broadlink)
Black BeanをPythonからコントロールするためのライブラリとコマンドラインインターフェースが用意されています。
次のコマンドを実行するとpython-broadlinkフォルダにファイルがコピーされます。
git clone https://github.com/mjg59/python-broadlink.git
Black Beanのセットアップを行うツールも用意されていますが、スマホアプリで済ませた方が簡単です。
cliフォルダには2つのコマンドファイルが用意されています。これらを使うのに必要なライブラリをインストールしておきます。
sudo pip install broadlink
※2017/7/4追加
インストール中に「Python.h」でエラーが出た時は、以下を実行してからもう一度行ってください。
sudo apt-get install python2.7-dev
最初にboradlink_discoveryを実行してbroadlink_cliでデバイスの識別に必要な情報を取得します。
pi@raspi3:~/python-broadlink/cli $ ./broadlink_discovery
discover
###########################################
RM2
# broadlink_cli --type 0x2712 --host 192.168.xx.xx --mac ffffffffffff
Device file data (to be used with --device @filename in broadlink_cli) :
0x2712 192.168.xx.xx ffffffffffff
temperature = 12.5
デバイスタイプが何故かRM2と表示されますが問題ないようです。Black Beanに温度センサーはないので12.5は見なかったことにしましょう。
0x2712 192.168.xx.xx ffffffffffff
をROOM.deviceというファイル名で保存しておきます。
つぎにcliを使って赤外線リモコンの学習を行います。スマホアプリでも既にリモコンを登録しているかも知れませんが、リモコンの情報はBlack Beanではなくスマホ側に保存される仕組みになっているため利用できません。
次のコマンドを実行するとBlack Beanが学習モードになるので、Black Beanに向けてリモコン操作をします。この例ではLIGHT.onファイルに学習内容が保存されます。
broadlink_cli --device @ROOM.device --learnfile LIGHT.on
Black Beanに学習した内容を送るには次のようにします。
broadlink_cli --device @ROOM.device --send @LIGHT.on
長いコマンドをいちいち打つのは大変なので、次のようなシェルスクリプトを書いてroomというファイル名で保存しroom LIGHT.on
のような感じで使えるようにしています。
Node-RED Alexa Home Skill Bridge
今回のキモがこの「Node-RED Alexa Home Skill Bridge」です。
ぼくはEcho対応機器を持っていなかったので、汎用的にAlexaから機器をコントロールする仕組みが必要でした。このサービスは自分でAmazon Echo's Home Skill systemに対応した機器(devices)を定義して、Node-REDでコントロールすることができるという夢のようなものです。
アカウント登録に必要な情報はUsername, Email, Passwordだけです。ログインすると、自分のデバイスを定義する画面が表示されます。
ぼくは照明とエアコンをON・OFFする定義を追加しました。
上の図は照明の定義です。機器のON・OFF以外も定義できるで工夫しだいでいろいろと使えると思います。
前出のAmazon Alexaサイトの「Smart Home」メニューで「Node-RED」Skillを追加して「Discover Devices」をクリックすると定義した機器が追加されます。
Node-RED
Node-REDの動作プラットーフォームにはRaspberry Piを使いました。
デフォルトでインストールされているNode-REDでは「node-red-contrib-alexa-home-skill」のインストールが失敗したため、Node-REDのアップデートを行いました。次のコマンドを実行します。
update-nodejs-and-nodered
アップデートが終了するのにRaspberry Pi 3で10分ぐらいかかりました。
アップデートが終わったら「node-red-contrib-alexa-home-skill」のインストールを行います。Node-REDを実行してブラウザで「localhost:1880」にアクセスします。「デプロイ」の横の3本線をクリックしてメニューを開き、「処理ノードの追加削除」をクリックします。
すると、左メニューが以下のように表示されるので「処理ノードを追加」タブを選びます。検索フィールドに「node-red-contrib-alexa-home-skill」と入力するとノードが表示されるので、「処理ノードを追加」をクリックします。
次の画面で「Install」をクリックします。
インストールが終わると左メニューの下の方にalexaノードが追加されます。
ぼくが作った照明をON・OFFするフローはこんな感じです。
Light(alexa-home)ノードの定義
鉛筆マークをクリックして「Node-RED Alexa Home Skill Bridge」に登録したユーザー名とパスワードを入力すると、登録したデバイスが選択できるようになります。
switchノードの定義
「Node-RED Alexa Home Skill Bridge」で登録したデバイスのActionsのOn・OffはOnだと「true」、Offだと「false」となります。
Light.on・Light.off (exec)ノードの定義
「Python control for Broadlink RM2 IR controllers (python-broadlink)」で作成したroomシェルスクリプトを実行させます。Light.onの部分をLight.offとすれば消灯ようの定義になります。
debugノードの定義
デバッグタブとコンソールにLightノードに届いたメッセージを表示するようにしています
フローの定義が終わったら、デプロイするのを忘れないようにしてくださいね。ぼくは修正だけしてデプロイするのを忘れ、あれ~?ってことがちょくちょくあります。
Alexaにお願いする
消灯のリモコン学習や、エアコンのオン・オフ学習、エアコンのフローを追加すると、照明とエアコンのオン・オフをAlexaにお願いすることができるようになります。
Alexa, turn on the light.
Alexa, turn off the light.
Alexa, turn on the aircon.
Alexa, turn off the aircon.
Echosimではマイクボタンを使っているので、最初の「Alexa」は言わなくていいのですが、雰囲気が出るので言うようにしています。「the」も言わなくていいんですが、文法上自然なので言っています。