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

角度を変えるサーボモータにirMagician(赤外線モジュール)をつけ、それをラズパイに接続します。
で、Alexaから自宅のラズパイ上に用意したBottle(HTTPサーバ)にHTTPを飛ばし、それをトリガにirMagicianとサーボモータを動かすことで、自宅照明のON/OFFをAlexa経由でやっちゃおう、というのが今回の趣旨です。
 
なのでAlexaスキルを作ります。
過去に調べた感じでは、IFTTTのWebhookと連携させないと実現できないような記事ばっかりだったので、面倒だな…と思ってましたが、どうやらAlexaスキルはPython(lambda)で作れるらしいと知ったので、今回はそれでやっています。
今回は自作スキルをベータテスト扱いで使うことになるので、使用期限は3ヶ月です。
スキルは基本的に全ユーザに公開する形になるので、特定のユーザに提供したいといった場合は、ベータテストで提供するか、Alexa for Business?を利用しなければいけない模様。
3ヶ月後に何をすればまた有効化できるのか(スキルを作り直す必要があるのか)はまた確認します。
追記:スキルを作り直す必要はないようですが、ベータテスト設定を再度実施する必要があるようです。
 
irMagicianとサーボモータの操作については以下のとこらへんで書いているため、そちらを参考にどうぞ。
一応、一番最後にBottleで動くソースとサーボモータ+irMagicianのソースを書いときます。
engetu21.hatenablog.com
 
engetu21.hatenablog.com

自宅サーバへのHTTPの引き込みは、ルータでポートを開けるか、以下のSSHポートフォワーディングで実現する必要があります。
engetu21.hatenablog.com



1.スキル作成

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


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


左上の「スキル開発」→「開発者コンソール」を押下。


開発者登録をしていないとここで入力が必要になるようです。
サクッと情報を入れて、スキル開発に進みます。
 

左側の「Alexa Skills Kit」を押下します。
 

「スキルの作成」を押下することでスキル作成が始まります。
 

スキル名を設定。「アレクサ、○○」の○○部分にもなるので、
呼びたい名称を設定します。
 

モデルはデフォルトのカスタム。
 

バッグエンドリソースのホスティングPythonを選択。
すべて選択したら右上の「スキルを作成」を押下。
 

テンプレートはデフォルトのスクラッチで作成のままで「テンプレートで続ける」を押下。
 

2.ソースの変更

コードエディタタブを押下し、「lambda_function.py」のソースを変更します。

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.(ベータテストとして)開発スキルの公開

公開タブを押し、公開用の設定を行っていきます。

誰にも公開しない、自分だけのスキルになるため、正直内容は適当でもいいです。
以下項目をそれぞれ埋めます。
公開名、説明、詳細な説明、サンプルフレーズ、小さなスキルアイコン、大きなスキルアイコン、カテゴリー
 

上記を埋めると、プライバシーとコンプライアンスの設定画面に飛ぶため、これも※印の部分をすべて回答します。
基本的にすべて「いいえ」で問題なし。
 

これまでの設定に問題なければ、ベータテスト欄にて、Eメールの設定ができます。
ここで、管理者用メールアドレスとベータテスター向けのメールアドレスを設定します。
自分だけで使う場合は、一緒のメールアドレスでOK。
設定後に「ベータテスト有効化」のボタンを押下。
有効になると同時にテスターメールアドレスにメールが飛ぶため、そちらを確認します。
飛んできたメールの
JP customers: To get started, follow this link:
の文言の下にあるURLを押すことで、Alexa設定画面に飛びます。
※リンクは2つありますが、必ずJP customers: To get started, follow this link:の方を押下すること
 

上記のようなメッセージが出てくるはずなので、「スキルテスト」を押下。
 

「有効にする」を押下し、利用が可能となります。
 
なお、スキルが実際にAlexaで使えるようになるには、若干時間がかかる(数分~数十分?)ので、気長に待ちましょう。
 

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

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

from bottle import route, run, template
import subprocess

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

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

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

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

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

 
上記で作ったPython自動起動させるために、以下のようにShellファイルを作成します。

$ vi /home/pi/site/start_syomei.sh
#!/bin/bash

nohup python3 /home/pi/site/syomei.py &

exit 0


systemdで動かす設定ファイルを作成します。

$ sudo vi /lib/systemd/system/start_syomei.service

[Unit]
Description=python program
After=network.target

[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/home/pi/site/start_syomei.sh
Restart=no
User=pi

[Install]
WantedBy=multi-user.target

 
以下のコマンドで自動化。
$ sudo systemctl enable start_syomei.service
スタートは以下。
$ sudo systemctl enable start_syomei.service
 

以下はPythonで作った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で統一も面倒だなぁ。とか、そういう理由というだけです。
基本的にPython内でsubprocessで書けばShellで用意する必要はないはずです。