こちらの記事は,Alexaで家電を操作するためのあれこれ(Raspi設定編)の続きです.
Node-RED はデバイス,API,オンラインサービスをコードを殆ど書くことなく接続できるプラットフォームのこと.
今回はその Node-RED を使用してAmazon Echo とRaspberyPiの繋ぎ方,RaspberyPiからNature Remo APIの使い方をメモっておく.

事前準備
Wi-fi接続が完了し,IPアドレスを固定したRaspberryPi
Amazon Alexa アプリのダウンロード
Amazon Echo Dot のセットアップ
わからない場合はこちら
環境
Amazon Echo dot
Raspberry Pi 3 Model B
Nature remo mini
macOs 10.14
Raspbian OS Version October2018
本記事では以下の記事を参考にさせていただきました.
【IoT】4.Node-REDの設定をしてみる
Nature Remo APIとAlexaで部屋中の家電を操作する話
Node-RED Alexa Home Skill Bridgeに登録する
こちらのページ画面左上より[Register]を選択し登録を行う.
デバイスを追加
ログイン後,[Add Device]をクリックしデバイスを追加する.

その際にAlexaに呼びかけたいデバイス名を付ける.今回はデバイス名を「電気」にする. ライトのように操作が点灯/消灯に限定されているデバイスは,ON, OFFのみにチェックを入れる.
Alexaアプリでデバイスを検出
現状では,Alexaに**「アレクサ,電気付けて」と話しかけると,「電気というデバイスを検出できませんでした」**と返ってくる,
そこで,Alexaアプリに「Node-RED」のスキルを追加し,ホーム画面から,[デバイス -> + ボタン -> デバイスを追加 -> その他] より,電気というデバイス検出する. 検出後はアレクサに話しかけると, **「電気から応答がありません」**と言うようになる.
RaspberryPiに Node.js, npm をインストール
Node-REDを動かす際に必要なNode.js, npmを以下のコマンドでインストールする.
sudo apt-get update sudo apt-get install -y nodejs npm sudo npm cache clean sudo npm install npm n -g sudo n stable
RaspberryPiに Node-REDをインストール
sudo apt-get install nodered update-nodejs-and-nodered
また,Node-REDが自動で立ち上がるようにするために,以下のコマンドを実行.これによりRaspberryPiに電源を繋げただけでNode-REDが起動する.
sudo systemctl enable nodered.service
Node-REDの起動
node-red
または,
node-red-start
で起動させる.
サーバは,[http://*******:1880 ]で実行中です
と表示されたら,[http://ラズパイのipアドレス:1880/]をブラウザのアドレスバーに入力する.すると以下のようなNode-REDの画面が表示される.

Node-REDでAlexaスキルのためのノード追加
右上の三本線のメニューから
[パレットの管理 -> ノード追加 -> node-red-contrib-alexa-home-skillを検索して追加]
ノード一覧の一番下にalexaのノードが出現する.
Alexa-home のノードにデバイスを設定
alexa home のノードをフロー上に移動させ,ダブルクリックする.「Node-RED Alexa Home Skill Bridge」で登録したアカウント名を入力し更新すると,追加したデバイス名が表示される.

<デバイス名が出てこない時>
私の場合は,なかなか出てこなくて詰んでいたので解決したケースを記述.
- alexa home ノード配置後デプロイを押す
- デバイスを新しく作る
- 有線のsshで入る
- OSを入れ直す
などを行うことによりデバイス名が表示されることがあった.
最終的にOSを入れ直すことにより解決しました.なんでだったんだろ...
ノードを追加
Switchノードを以下のように配置する.

Switchノードをダブルクリックし,入力が true か false によって分岐するように設定.

changeノードを接続

changeノードをダブルクリックし,プロパティにそれぞれ on と off を設定.

execノードをchangeノードの先に追加する.

execノードをダブルクリックし,コマンド欄に実行ファイルのパスを通す.「アレクサ,電気付けて」と言った際,引数[on]がexecノードに渡され,シェルスクリプトが実行される.
シェルスクリプトの内容はのちに示すので,一旦完了を押しておく.

debugノードを追加すると,execノードがどんな引数を受け取っているかを確認できる.

Nature Remo の API を利用
Nature Remo は APIが提供されているので,登録した赤外線の送信,センサ情報の取得などができる.
新規アクセストークンの発行はこちらからできるので,発行してメモっておく.
APIをいじってみる
API仕様を参考にAPIをいじってみる.例えば,
puts 'curl -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" -H "Authorization: Bearer アクセストークン"'
と入力し,自分のメモったアクセストークンを加えると,デバイス名とそれぞれのIDなどが分かる.ただし読みづらいのでjqコマンドを以下のように加えることで見やすくなる.
電気デバイスのON,OFFのIDがそれぞれ一つずつ表示されるので,両方メモっておく.
puts 'curl -X GET "https://api.nature.global/1/appliances" -H "accept: application/json" -H "Authorization: Bearer アクセストークン" | jq .'
次は電気のON, OFFの操作を試る.
メモった電気デバイス - ON のIDを使ってコマンドを入力すると,電気が点灯する.同様にOFFのIDを使うことで消灯が実現できる.
puts 'curl -X POST "https://api.nature.global/1/signals/電気デバイスONのID/send" -H "Authorization: Bearer アクセストークン"'
ON/OFF 操作するシェルスクリプトを作成
Node-REDで true か false が引数($1)に来るように設定したので,これとAPIをいじった際のコマンドを組み合わせてシェルスクリプトを作成する.
# !/bin/bash
case $1 in
on)
curl -X POST "https://api.nature.global/1/signals/電気デバイスONのID/send" -H "Authorization: Bearer アクセストークン"
;;
off)
curl -X POST "https://api.nature.global/1/signals/電気デバイスOFFのID/send" -H "Authorization: Bearer アクセストークン"
;;
esac
スクリプトは私のGithubにあげておくので見た人は見てください.
このスクリプトファイルを,先程作成した Node-red で execノードのプロパティに指定する.そして,chmod +x denki.sh
コマンドで実行権限を与えると準備完了!!
「アレクサ,電気付けて!」と言うと電気が点灯し,「アレクサ,電気消して!」と言うと電気が消灯.あら素敵.
今後は,エアコンの操作とそれぞれ操作した時間帯を取得し可視化でもしようかなと.温度もAPIでとってこれるみたいなので,組み合わせると面白いかも?