Alexa+Node-RED+Nature Remo miniでスマートホーム化の第二歩 〜テレビを制御する〜

はじめに

Alexa+Node-RED+Nature Remo miniでテレビを制御していきます。

Node-RED Alexa Home Skill Bridgeのアクションのみで自然な音声コマンドを使用するためには一工夫必要になります。今回は、Alexaアプリの定型アクションを使用することでこれを実現していきます。

制御フローの完成イメージ

環境

前提

目次

  1. 取り扱うNature Remoボタン制御の内容
  2. Node-RED Alexa Home Skill Bridgeへのデバイス登録
  3. Alexaアプリへデバイスの登録
  4. 定型アクションの登録
  5. Node-REDへAlexaノードの登録
  6. switchノードの作成
  7. change/function/jsonノードの作成
  8. Alexaで操作する

取り扱うNature Remoボタン制御の内容

テレビの制御を行うに当たり、今回はNature Remoアプリに設定した以下のボタン機能をAlexaで使用できるようにしていきます。

  • 電源
  • ホーム
  • 戻る
  • 入力切換
  • 音量+
  • 音量-
  • 決定
  • 1
  • 2
  • 3
  • 4
  • 5
  • 7
  • 8

Node-RED Alexa Home Skill Bridgeへのデバイス登録

Node-RED Alexa Home Skill Bridgeにログインし、Device登録します。

項目名 設定値 説明
Name テレビ デバイス名を設定します。Alexaへ呼びかけるデバイス名になります。後から変更できません。
Description テレビ制御 デバイスの説明を設定します。後から変更可。
Actions On、Off、% 制御したいアクションを選択します。今回は電源オン、オフ、チャンネル、音量、入力切替等を行います。後から変更可。
Application Type   選択不要。後から変更可。

back

Alexaアプリへデバイスの登録

Alexaアプリを開き、「スマートホーム」から「デバイスを追加」をタップします。「デバイスを追加」の前にEcho dotを起動していないと検索に失敗するようです。

「テレビ」が追加されていることを確認します。「タップしてコントロールまたは編集」と表示されている場合はタップします。

back

定型アクションの登録

Alexaに登録する定型アクションをまとめます。Node-RED Alexa Home Skill Bridgeの"%"Action(msg.command:SetPercentageRequest)を使用します。

チャンネル変更に関しては、定型アクションのパーセント設定値とNature Remoボタン名を同一に設定してください(Nature Remoノードに渡すJSONのname属性に定型アクションで指定した%値を直接渡すことで余計な分岐を作らないためです)。

定型アクション Nature Remoボタン名 msg.payload 説明
実行条件 %
アレクサ、KBC 1 1 1 チャンネル変更
アレクサ、Eテレ 2 2 2 チャンネル変更
アレクサ、NHK 3 3 3 チャンネル変更
アレクサ、RKB 4 4 4 チャンネル変更
アレクサ、FBS 5 5 5 チャンネル変更
アレクサ、テレQ 7 7 7 チャンネル変更
アレクサ、テレビ西日本 8 8 8 チャンネル変更
アレクサ、音量上げて 50 音量+ 50 音量+
アレクサ、音量下げて 51 音量- 51 音量-
アレクサ、ホームに移動 60 ホーム 60 ホームボタン
アレクサ、戻って 61 戻る 61 戻るボタン
アレクサ、入力切替 62 入力切替 62 入力切替
アレクサ、上に移動 70 ⬆️ 70 矢印ボタン
アレクサ、下に移動 71 ⬇️ 71 矢印ボタン

設定例



音量に関して、定型アクションを利用している理由
「Node-RED Alexa Home Skill Bridgeの+%、-%を使用すればいいじゃないか」と思うことでしょう。
ですが、この機能の音声コマンドを使用すると、「テレビを明るくして」、「テレビを暗くして」という発話になり、機能と言葉の結びつきが一致しません。
そのため、"%"Action機能と定型アクションを利用して、自然な音声コマンドとなるようにしています。

back

Node-REDへAlexaノードの登録

Alexa Homeノードをドラッグ&ドロップで配置し、ダブルクリックします。

Account欄の鉛筆アイコンをクリックします。

Node-RED Alexa Home Skill Bridgeのユーザ名とパスワードを設定します。

Deviceに「テレビ」を選択し、「完了」をクリックします。

switchノードの作成

TV制御(Command)用switchノードの作成

switchノードをドラッグ&ドロップで追加します。このswitchノードでは、msg.commandによる条件分岐を行い、電源オン、オフとそれ以外の処理を分けます。

switchノードをダブルクリックし、プロパティの編集画面を開きます。

名前はノードの名称になります。適当に設定します。プロパティは、「command」と入力します。

「+追加」をクリックし、条件を追加します。入力欄に以下を順に設定します。

  1. TurnOnRequest
  2. TurnOffRequest
  3. SetPercentageRequest

commandの概要を以下にまとめます。

Alexaへの発話 Action 対応するコマンド
(msg.command)
説明
〇〇をオン
〇〇をつけて
On TurnOnRequest 電源オンのコマンド。
〇〇をオフ
〇〇を消して
Off TurnOffRequest 電源オフのコマンド。
〇〇を〇%にして
〇〇を〇にして
% SetPercentageRequest 値指定のコマンド。

「完了」をクリックすると、以下のフローになります。

switchノードの出力側に3つの出力が作成されています。

TV制御(payload)用switchノードの作成

switchノードをドラッグ&ドロップで追加します。このswitchノードでは、msg.payloadの値に基づいた処理を行うための条件分岐を作成します。

switchノードをダブルクリックし、プロパティの編集画面を開きます。

名前はノードの名称になります。適当に設定します。プロパティは、「payload」のままとします。

「+追加」をクリックし、条件を追加します。入力欄に以下を順に設定します。

  1. == 50 ・・・「音量を上げるchangeノードを接続」
  2. == 51 ・・・「音量を下げるchangeノードを接続」
  3. == 60 ・・・「ホームに移動するchangeノードを接続」
  4. < 30 ・・・「チャンネル変更functionノードを接続」
  5. == 61 ・・・「戻るボタンchangeノードを接続」
  6. == 62 ・・・「入力切換changeノードを接続」
  7. == 70 ・・・「上に移動changeノードを接続」
  8. == 71 ・・・「上に移動changeノードを接続」

「完了」をクリックすると、以下のフローになります。

switchノードの出力側に8つの出力が作成されています。

back

change/function/jsonノードの作成

チャンネル変更、入力切換以外のchangeノード作成

changeノードをドラッグ&ドロップで追加します。

changeノードをダブルクリックし、編集します。

「名前」はノードの表示名なので、わかりやすい名前をつけます。

「対象の値」は”{}JSON”を選択します。「…」をクリックし、JSONを入力します。

Nature Remoのリモコン設定情報を取得」で取得したremo.jsonファイルを元に、nicknameとnameを編集します。

以下のchangeノードも同様に作成します。

  • 電源オフ
  • 音量アップ
  • 音量ダウン
  • ホーム
  • 戻る

電源オフのJSONのnameは電源オン時と同じ名前になります。テレビの電源ボタンは電源オン、オフで同じボタンを使用するためです。

ここまでで、以下のフローが作成されている状態になりました。

 

入力切換のchangeノード作成

入力切換のchangeノードを作成します。

changeノードをドラッグ&ドロップで追加します。

changeノードをダブルクリックし、編集します。

入力切替の場合、入力切替ボタンを押下しただけでは切り替わらないため、「入力切替」、「↓」、「決定」のコマンドを送信するようにしています。

 

チャンネル変更のfunctionノード作成

チャンネル変更はfunctionノードを使用します。changeノードをチャンネル数分用意するのが面倒なためです。

functionノードをドラッグ&ドロップで追加します。

functionノードをダブルクリックし、編集します。

コードは、入力値のmsg.payloadを取得し、JSON形式のStringに入力値のmsg.payload値を設定して返却しているだけです。

定型アクションの登録

チャンネル変更に関しては、定型アクションのパーセント設定値とNature Remoボタン名を同一に設定してください。

と書いたのは、定型アクションからきた%パラメータをNature Remoのname属性値にそのまま設定したかったからです。

var input = msg.payload;
msg.payload = "{ \"commands\": [ {\"nickname\": \"4Kブラビア\", \"name\": \"" + input + "\"} ] }";
return msg;

 

jsonノード作成

チャンネル変更で設定したJSONは、オブジェクトではなくStringのためJSONオブジェクトへ変換する必要があります。

jsonノードをドラッグ&ドロップで追加します。

jsonノードをダブルクリックし、編集します。

動作に「JSON文字列とオブジェクト間の相互変換」を選択します。

プロパティは、「payload」のままで「完了」をクリックします。

最後に、リンクされていないノード間をつなぎ合わせたら、右上の「デプロイ」をクリックします。

「デプロイが成功しました」と表示されたら完成です。

back

Alexaで操作する

定型アクションで設定した開始フレーズでAmazon Echo dotまたはAlexaアプリに話しかけて操作してみましょう。

うまく動作しない場合、debugノードを追加し、msg.payloadやmsg.commandの値を確認しながら不具合を解消していきましょう。

back