【Alexa】Alexaのスキルを作って自宅照明を点ける

角度を変えるサーボモータにirMagician(赤外線モジュール)をつけ、それをラズパイに接続します。
で、Alexaからラズパイ上に用意したBottleのサーバにHTTPを飛ばし、それをトリガにirMagicianとサーボモータを動かすことで、自宅照明のON/OFFをAlexa経由でやっちゃおう、というのが今回の趣旨です。
なのでAlexaスキルを作ります。
今回は自作スキルをベータテスト扱いで使うことになるので、使用期限は3ヶ月です。3ヶ月後に何をすればまた有効化できるのか(スキルを作り直す必要があるのか)はまた確認します。
 
irMagicianとサーボモータの操作については以下のとこらへんで書いているため、そちらを参考にどうぞ。一応、一番最後にBottleで動くとサーボモータ+irMagicianのソースを書いときます。ルータのポートを開けておくのは忘れずに。
engetu21.hatenablog.com
 
engetu21.hatenablog.com


1.スキル作成

Alexaの開発者ポータルサイトにアクセス。
developer.amazon.com

f:id:engetu21:20220217213603j:plain
左上のAlexaを押下。
ログインは自分が持っているAmazonアカウントを使用します。

f:id:engetu21:20211213225926j:plain
左上の「スキル開発」→「開発者コンソール」を押下。

f:id:engetu21:20211213230223j:plain
開発者登録をしていないとここで入力が必要になるようです。
サクッと情報を入れて、スキル開発に進みます。
 
f:id:engetu21:20211213230833j:plain
左側の「Alexa Skills Kit」を押下します。
 
f:id:engetu21:20211213231002j:plain
「スキルの作成」を押下することでスキル作成が始まります。
 
f:id:engetu21:20211213231349j:plain
スキル名を設定。「アレクサ、○○」の○○部分にもなるので、
呼びたい名称を設定します。
 
f:id:engetu21:20220217214122j:plain
モデルはデフォルトのカスタム。
 
f:id:engetu21:20211213234251j:plain
バッグエンドリソースのホスティングPythonを選択。
すべて選択したら右上の「スキルを作成」を押下。
 
f:id:engetu21:20220217214538j:plain
テンプレートはデフォルトのスクラッチで作成のままで「テンプレートで続ける」を押下。
 

2.ソースの変更

コードエディタタブを押下し、「lambda_function.py」のソースを変更します。
f:id:engetu21:20220217215904j:plain

import requests
url = 'http://XXXXXXXXXXXXXX'

class LaunchRequestHandler(AbstractRequestHandler):
    """Handler for Skill Launch."""
    def can_handle(self, handler_input):
        # type: (HandlerInput) -> bool

        return ask_utils.is_request_type("LaunchRequest")(handler_input)

    def handle(self, handler_input):
        # type: (HandlerInput) -> Response
        # speak_output = "Welcome, you can say Hello or Help. Which would you like to try?"

        response = requests.get(url)

        return (
            handler_input.response_builder
                #.speak(speak_output)
                .speak(response.text)
                #.ask(speak_output)
                .response
        )

・変更点
1.import requests を追加
2.url = ''でHTTPを飛ばしたいURLを変数に設定
3.speak_output変数の定義部分をコメントアウト
4.response = requests.get(url) を追加
5..speak(speak_output) をコメントアウト
6..speak(response.text) を追加
7..ask(speak_output) をコメントアウト
どうやら「.speak」に設定した文言をAlexaはしゃべってくれるようなので、
ここにHTTPレスポンスでもらったメッセージを指定することで、それをしゃべらせるようにします。
 
変更が完了したところで、右上の「デプロイ」を押下。
 
3.(ベータテストとして)開発スキルの公開
公開タブを押し、公開用の設定を行っていきます。
f:id:engetu21:20220217221723j:plain
誰にも公開しない、自分だけのスキルになるため、正直内容は適当でもいいです。
以下項目をそれぞれ埋めます。
公開名、説明、詳細な説明、サンプルフレーズ、小さなスキルアイコン、大きなスキルアイコン、カテゴリー
 
f:id:engetu21:20220217222329j:plain
上記を埋めると、プライバシーとコンプライアンスの設定画面に飛ぶため、これも※印の部分をすべて回答します。
基本的にすべて「いいえ」で問題なし。
 
f:id:engetu21:20220217222437j:plain
これまでの設定に問題なければ、ベータテスト欄にて、Eメールの設定ができます。
ここで、管理者用メールアドレスとベータテスター向けのメールアドレスを設定します。
自分だけで使う場合は、一緒のメールアドレスでOK。
設定後に「ベータテスト有効化」のボタンを押下。
有効になると同時にテスターメールアドレスにメールが飛ぶため、そちらを確認します。
飛んできたメールの
JP customers: To get started, follow this link:
の文言の下にあるURLを押すことで、Alexa設定画面に飛びます。
※リンクは2つありますが、必ずJP customers: To get started, follow this link:の方を押下すること
 
f:id:engetu21:20220217223113j:plain
上記のようなメッセージが出てくるはずなので、「スキルテスト」を押下。
 
f:id:engetu21:20220217223359j:plain
「有効にする」を押下し、利用が可能となります。
 
なお、スキルが実際にAlexaで使えるようになるには、若干時間がかかる(数分~数十分?)ので、気長に待ちましょう。
 

4.Bottleで動くHTTPサーバのソースとirMagician+サーボモータのソース

書いておかないと自分が困りそうな気がしてきたので記載しておきます。
以下、Bottleで動作するHTTPサーバのソース。

from bottle import route, run, template
import subprocess

@route('/temae_on')
def temae_on():
    subprocess.call("/home/pi/kadensousa/shells/temae_light_on.sh", shell=True)
    response = f'手前の照明をつけました'
    return response

@route('/temae_off')
def temae_off():
    subprocess.call("/home/pi/kadensousa/shells/temae_light_off.sh", shell=True)
    response = f'手前の照明を消しました'
    return response

@route('/oku_on')
def oku_on():
    subprocess.call("/home/pi/kadensousa/shells/oku_light_on.sh", shell=True)
    response = f'奥の照明をつけました'
    return response

@route('/oku_off')
def oku_off():
    subprocess.call("/home/pi/kadensousa/shells/oku_light_off.sh", shell=True)
    response = f'奥の照明を消しました'
    return response

run(host='0.0.0.0', port=50001)

 
以下、HTTPサーバから呼び出されるShellの中身。

#!/bin/bash

echo 0=50 > /dev/servoblaster

python /home/pi/kadensousa/irmcli/irmcli.py -p -f /home/pi/kadensousa/irmcli/light_on.json

sleep 1

echo 0=70 > /dev/servoblaster

何でPythonとShellでそれぞれ分けてんの?って話ですが、最初にそういう風に作ったのでそれに倣ってるだけ、というのが理由で、基本的にPython内でsubprocessで書けばShellで用意する必要はないです。