技術戦略部より、tipsやノウハウなど技術的な話題を発信いたします。by2019.1.8開発Alexaのスマートホームスキルの作り方!IFTTTをトリガーと言わずに操作できるようにする開発チームの下田です。dotが発売されました。dotは独自仕様の電源で、ちょっと不便だと思いました。dotを購入しました。足りない機能は自分で開発できて楽しいです。Alexaに自然に語りかけるようにIFTTTを操作できるスキルを作ってみたので、手順を説明します。Thatの頭文字から名前をつけられたサービスで、直訳すると「これならば何かする」という意味です。「3時になった」ならば「おやつの催促をメール」するといったことができるサービスです。時間だけでなく、特定のURLにリクエストがあったらというwebhookといったこともトリガーになります。検索するとIFTTTわかりやすい解説記事がたくさんあるので、今回は詳しい説明を省略します。Alexaで操作できることechoシリーズではAIであるAlexaを利用可能で、対応した機器であれば「エアコンの電源をつけて」とか「テレビのチャンネルをNHKにかえて」などと指示できます。対応した機器では「エアコンの電源をつけて」のように自然なワードで起動できます。「エアコンつけて」、「リビングのエアコンの電源オフ」などと言い換えても動作します。対応した機器でなくとも、IRKitなどのIoTデバイスなら割と簡単にAlexaから操作できます。IoTデバイスはIFTTTのアプレットから指示を出せるものが多いです。エアコンの電源つけて」などと指示できます。IFTTTスキルの場合、IFTTTを呼び出すためのワード「トリガー」を必ずつけて言わなければなりません。設定した単語にしか反応しません。「エアコンの電源つけて」と設定しても「エアコンオン」では動作しません。両方動作させるには両方の設定が必要です。何が違うのか?Alexaのスキルには種類があります。前者はデバイス操作用のスマートホームスキルで、Alexaのインターフェースに沿って実装すると、ワードはいい感じにAlexaが解釈してくれます。後者は汎用のカスタムスキルで、ワードの解釈はスキルに任されています。「トリガー」のような特定のワードが必要になるので、ちょっと使い勝手が悪いです。いい感じに操作したい!IFTTTのカスタムスキルを使った方法でもやりたいことはできるにはできる・・のですが、せっかくスマートスピーカーを使うからにはAIがいい感じにやってほしいと思いました。IFTTTを使えばスマートデバイスを操作できるIFTTTの公式スキルはカスタムスキルスマートホームスキルを使えばいい感じということは、「スマートホームスキルからIFTTTのwebhookにリクエストすれば、いい感じにたいていのことができる」ことになるのではと考えたので、実装してみました。スマートホームスキルの概要スマートホームスキルは3段階のステップがあります。操作アカウントリンクスマートホームスキルはIoTデバイスの操作用なので、アカウント設定が必要です。アカウント設定がないと他の人にデバイスを操作されかねませんなので、スマートホームスキルではデバイスのアカウントと連携する「アカウントリンク」が必須となっています。アカウントリンクではOAuth2による連携が必須となっています。※ここのところを開発するとこの記事では足りないので省略し、直接IDをコードに記入して自分専用のアプリを作る前提とします。デバイスの登録スマートホームスキルは1つでも、デバイスが複数になる場合があります。リビングの照明と寝室の照明の2つを操作するときです。スマートホームスキルをAlexaに登録したあとにデバイスを見つけ出し(discover)、登録する必要があります。デバイスの操作スマートホームスキルとデバイスの登録が完了したら、ようやくそのデバイスを操作できます。スマートホームスキルの作成それではスマートホームスキルを作成していきます。Consoleから登録できます。ここでは必ず自分が使用するechoを登録しているAmazonアカウントを使用してください。同じアカウントでないと、今回開発したスキルを使用できません。この記事の読者は日本のamazon、amazon.co.jpのアカウントを利用されているかと思いますので、そちらを利用してください。初回ログイン時には開発者アカウントの情報登録が挟まります。ログインが完了するとスキルの一覧画面が表示されるので、「スキルの作成」ボタンをクリックしてください。スキル名、言語、種類を選択します。ここでは「ifttt_webhook」、日本語、スマートホームを選択しました。アカウントリンクを実装OAuth2によるアカウントリンクを設定していきます。動けばいいので、詳細は省略し手順を記載します。左のタブにアカウントリンクがあるので、選択してください。下の方にリダイレクト先のURLがあるのでメモしておきます。OAuth2の認可サーバを用意します。Amazonを利用します。アカウントはどれでも大丈夫です。ログインしたら左ペインにある「新しいアプリケーションを登録する」を選択します。名前、詳細、プライバシー規約URLを入力します。今回は公開しないので全部適当でOKです。作成したら、WEB設定を開き編集、さきほどメモしたリダイレクト先のURLを入力、保存します。Secretをメモします。Consoleに戻り、先ほど開いたアカウントリンクに入力していきます。なし入力したら保存します。アカウントリンクをテストする正常にアカウントリンクが設定できたかテストしてみましょう。Alexaを開きます。左ペインの「スキル」を選択、右ペインの右上「有効なスキル」を選択すると作成したifttt_webhookが表示されています。ifttt_webhookを選択し、「有効にする」をクリックするとAmazonによる認証を求めらますので、認証します。「正常にリンクされました」と表示されればOKです。次はデバイスの登録を実装します。ConsoleのスキルIDをメモしておきます。ここから先はAWSのLambdaで実装してきます。関数の作成をクリックします。1つ以上のテンプレートから新しいロールを作成します。Homeトリガーを追加します。Homeを選択すると、下の方にスキルIDを入力する欄が表示されます。そこに先程メモしたスキルIDを入力し追加します。追加したら、右上にある保存ボタンから保存して完了です。保存ボタンの上にあるARNをメモしておきます。Consoleに戻り、メモしたARNをデフォルトのエンドポイントに入力し保存します。これで作成したスマートホームスキルとLambda関数が連携しました。コーディングようやくコードを書きます。スタートするまでが長くてつらいですね。Lambdaに戻り、作成した関数名をクリックすると、下部にコード入力欄が表示されます。ハンドラに「index.handler」を設定しておくとスマートホームスキルのイベントが発生したタイミングでindex.jsのexport.handlerに登録したfunctionが呼び出されます。下記のコードを入力し、保存します。console.log(request)}保存したら、すぐ左のテストボタンをクリックします。イベント名にDiscovery、テキストエリアに下記コードを入力します。}}※messageIdはリクエストごとにユニークなIDが採番されますが、テストでは固定の適当な値です保存すると、テストの左のドロップダウンリストに作成したテストが追加されます。選択した状態でテストボタンをクリックします。クリックするとコードの下に実行結果が表示されます。このあたりのテストの方法は公式ドキュメントにもわかりやすく解説されているので、参照してみると良いでしょう。Discoveryの要件デバイスの追加ができるよう、実装していきます。"Discover"}が渡されたら、どんなデバイスがあるかコールバックする次のコードになります。