こんにちは、はな夫(@logicalifer)です。
Alexaを利用したスマートホーム化を進めている我が家ですが、ちょっと困ったことがありました。
それは、Alexaでトグルスイッチをうまく操作できない問題です。
そこで、この記事ではRaspberry piと組み合わせてこの問題を解消した方法をご紹介します。
何が問題なのか
トグルスイッチは、一つのボタンで電源ON/OFFするようなスイッチです。我が家では照明のリモコンがそのようになっています。
そのため、Alexaに声をかける際、「ライトを点けて」でも「ライトを消して」でも、ライトが今の状態と逆になるだけだったのです。
基本的にライトを消すときはその部屋にいることがほとんどなので、操作したいように声を掛けても別に良いのですが、AlexaのPR動画でよくあるような、「おやすみ」と声掛けしてライトやエアコン等を全部消すことをやろうと思った時、点いていなかったライトが逆に点いてしまうという問題が発生しました。
解決策の検討
ライトの現在の状態をAlexaが記憶することができないことがこの問題の原因となっています。
そこで、今のライトの状態をRaspberry piが記憶し、Alexaの制御を手助けすることにします。
- Alexaに対して「ライトを点けて」と言う
- AlexaがRaspberry piへライトの点灯指示
- Raspberry piが現在のライトの状況に応じて、Alexaに対して点灯指示か、何もしないかを返答する
- Alexaが通知内容に応じて家電リモコンに指示を出す
- 家電リモコンがライトを付ける
ポイントは3のフェーズで、現在のライトの状況に応じて、本当に家電リモコンに指示を出すのか、何もしないのかを判断するところです。
また、ライトのON/OFFを切り替える場合には、Raspberry piで現在の状態を更新します。
RaspberrypiのNode-REDで仮想的なスマートデバイスを作成する
Raspberry piへのNode-REDのインストール方法については、下記の記事でご紹介しています。
今回は、下記のフローを作成します。
新しいノードとして、「node-red-contrib-alexa-remote2」を追加しているので、パレットの管理から追加が必要です。
amazon-echo-hubノード
関連記事と同じ方法で、まずはHubを作成します。
なお、既に別のフローにHubが存在する場合は、この操作は不要です。既にあるHubにdeviceを接続すればOKです。
amazon-echo-deviceノード
これはAlexaから指示を受けるための仮想的なデバイスです。
名前はご家庭の対象物に合わせて自由に変更してください。
switchノードその1
Alexaの指示によって場合分けをする部分になります。
Alexaの指示がmsg.payloadとして受け取るため、それを「on」か「その他(=off)」で場合分けをして、1と2に分岐します。
switchノードその2
ライトの点灯指示だった場合に、現在のライトの状況をチェックして場合分けするノードになります。
プロパティをmsg.payloadから、flow.livingLightに変更しています。
flow.livingLightは、このフロー内の内部変数として扱っており、今のライトの状態を保存しています。
先程のswitchノードと合わせて、下記のように分岐します。
- Alexaからの点灯指示かつ現在の状態がoffなら1へ
- Alexaからの点灯指示かつ現在の状態がonなら2へ
changeノードその1
switchノードその2の分岐から、実際に点灯することがわかったので、現在の状態を点灯に変更します。
具体的には、flow.livingLightの値をtrueへ変更しています。
Alexa Routineノードその1
今回新しく追加した「node-red-contrib-alexa-remote2」から、Alexa Routineノードを使用します。
Accountの部分を選択し、ご自身のamazonアカウントを入力する必要があります。
amazonのアカウントで使用するメール、パスワード以外に、service host等も入力する必要があります。公式サイトに記載されている通り、下記のように入力します。
アカウントの認証が通ると、Alexaアプリで登録しているデバイスや定型アクション等が選択肢として現れるので、デバイスや定型アクションを設定し、アクションをonにします。
我が家の場合はライトのスマートホームデバイスを設定しています。
ここまでで、ライトを点灯するまでのフローができました。
switchノードその3
switchノードその2の逆で、消灯指示だった場合のノードです。その2から反転した内容となっており、下記のように分岐します。
- Alexaからの消灯指示かつ現在の状態がonなら1へ
- Alexaからの消灯指示かつ現在の状態がoffなら2へ
Changeノードその2
Changeノードその1の逆です。現在のライトの状態がonのため、offを表すfalseに変更しています。
Alexa Routineノードその2
switchノードの分岐で、既にライトが指示のあった状態だったときに、Alexaから応答を返すようにしています。この言葉は何でも良いですし、このノードを作らずに無言でもよいと思いますので、お好みです。
Injectノード
上記までで、ライト操作のフローが完成しましたが、現在のライトの状態の初期値が必要です。
そのため、Injectノードを作成し、初期値を設定するためのフローを作成します。
Node-RED起動後の0.1秒後に以下を行うにチェックを入れておくと、デプロイ後に初期値にセットされます。
Changeノードその3
このノードで、ライトの状態の初期値を設定します。
下記の設定では初期値をoff=falseとしています。
以上までで、Node-REDのフローが完成しましたので、デプロイをします。
Alexaでデバイスを登録する
Alexaにて、新しいデバイスの検出を実施し、先程Amazon echo deviceとして登録した仮想デバイスを登録します。
登録後、定型アクションにて、ライトの点灯、消灯のアクションを設定します。このとき、電源のon/offを正しく設定しておくことで、先程のフローにon/offの指示が流れていきます。
まとめ
この操作で、Raspberry piに現在のライトの状態を記憶させて、トグルスイッチを正しく操作するためのフローが完成しました。
「おやすみ」や「ただいま」といった音声に連携した定型アクションに、この仮想デバイスの指示をするように設定すれば、意図しない反転動作をすることがなくなりますので、ぜひお試しください。
コメント