Alexaに「おやすみ」→部屋の電気を自動OFF+LINE APIで「おやすみ」とメッセージ

Alexaに「おやすみ」や「おはよう」と呼びかけると、以下などを同時に実行できるようにして生活の質を上げた・・・という話を書きます。

  • 部屋の電気を自動OFF
  • LINE APIで家族に「おやすみ」とメッセージ

 

※WEBエンジニア向けの記事です。

前提

我が家は、私と妻の2人暮らしです。

2人とも生活リズムがうんちですので、お互いに「今日はいつ寝ていつ起きたんだろう🤔」と思っています。

それだとあまりにも不便なので

  • 寝る前に「今から寝る」
  • 起きたときに「起きた」

などのメッセージ(スタンプ)をLINEで送るようにお互いに心がけていました。

▲毎日スタンプを送り合ってる

ただ、いちいちスタンプを送信するのが面倒くさいので、Alexaに「おやすみ」と話しかけるだけでメッセージを送れるようにすればいいのではと考えました🤔

  • 「○○、おやすみ」
    →LINE Message APIで「○○は就寝したようです」と通知する 
  • 「○○、おはよう」
    →LINE Message APIで「○○は起床したようです」と通知する

 

ふむ、名案だぜ!

・・と思ったのですが、もっと名案を思いつきました。

というのも我が家では以前から、スマートプラグとシーリングライトを接着剤でくっつけて無理やりIoT化して、「○○の電気を消して」と呼ぶだけで電気を消せるようにしていました。

  • 「たけしの電気を消して」
    →たけしの部屋のシーリングライトをOFF 
  • 「たけしの電気をつけて」
    →たけしの部屋のシーリングライトをON

▲スマートプラグとシーリングライトをダイソーの接着剤でくっつけて無理やりIoT化してます(貧乏人の発想)

 

そこで思いました。これらを組み合わせたら一言で、電気も操作できてLINEメッセージも送れるんじゃね?と。

具体的には以下のようにできるんじゃね?と😊

  • 「たけし、おやすみ」
    →たけしの部屋のシーリングライトなどをOFFにして、LINE Message APIで「たけしは就寝したようです」と通知する 
  • 「たけし、おはよう」
    →たけしの部屋のシーリングライトなどをONにして、LINE Message APIで「たけしは起床したようです」と通知する

 

これを実現するにはどうすればいいか調べたら、以下のような構成にすると良さげなことがわかりました👇

▲「たぶんこんな感じにすればいいんじゃね」の例

 

これを実現することで、Alexaに

  • 「おやすみ、たけし」
  • 「おはよう、たけし」

と呼びかけると、以下のようなメッセージを自動送信されると同時に、シーリングライトのON/OFFができるようになりました。

▲私、妻、作成したbotの3人のグループを作って、そのグループに対して通知を送るようにした

 

というわけでこれを実現するために必要なことをつらつら書きます。

全部細かく説明するとキリがないので「こういう流れで作れるよ」「詳しくはここを参考にしたらいいよ」という情報のみ書きます。

作るまでにやったこと

以下のリポジトリが今回の完成物です。

penpendayo/alexa-skill-serverless-framework

 

このリポジトリでAlexaスキルやLambdaコードをすべて管理しています。

なので、このリポジトリを真似すれば同じように作れます。

①Alexaスキル開発 の勉強

まず、自作スキルを作るための知識を習得しました。

以下のページの「スキル開発 基礎トレーニングシリーズ」を全部見るだけで、大体どうすればスキルを作れるか分かりました。

Alexa | アレクサ | Alexaスキル開発トレーニング

 

エンジニアなら「あー、そんな感じね」とすぐに理解できると思います。

②serverless framework で Alexaスキル と Lambdaコードのデプロイ

さきほどページによると、スキルで使用するバックエンドのホスティング先として、以下の2パターンがあるようです。

  • Amazonが用意してくれてるやつ(Alexa-hosted)
  • 自前でサーバーを用意しないといけないやつ(独自のプロビジョニング)

▲Alexa-hostedの場合はNode.jsかPythonのみ。

 

手軽なのは前者ですが、どうせなので後者でやってみたくなりました。

そして後者を実現するために、serverless frameworkというツールを使いました。(これは使わなくても大丈夫ですが、自分は使いたなかったので使いました)

serverless frameworkを利用すると、

  • AWSリソースをコードで管理できる
  • コマンドでAlexaスキルの作成・更新ができる
  • TypeScriptが使える
  • 自分の使いたいnpmパッケージをnpm installで使える
    (Lambdaだけで使う場合は、ローカルでnpm installしてnode_moduleディレクトリをzip圧縮してLambdaにアップロードみたいなことをしないといけない)

みたいなことができて、とても良い開発体験になります。

 

serverless frameworkの使い方などについては、以下のページなどを参考にしてほしいのですが

serverless frameworkでLambdaにExpressをデプロイ

Serverless FrameworkだけでAlexa Skill開発 | WP-kyoto

 

ざっくりいうと、以下のコマンドでAlexa開発のテンプレを作って

npx serverless create -t aws-alexa-typescript -p ask-serverless

 

以下のコマンドで、Alexaスキルを作ります。(これを実行するとAlexa Developer Console上にスキルが作成されます)

npx serverless alexa create --name "Serverless Alexa Typescript" --locale ja-JP --type custom

 

そして、serverless.ymlをいろいろ編集します。

たとえば、ざっくり以下などをします。

  • Lambdaで環境変数が使えるように設定する
    • .envファイルも作成する
  • 日本語版のAlexaスキルにするために、en-GB→ja-jpに変更
  • Alexaスキルにおける、インテントやスロットの作成

 

以下などのハマりポイントもありました。

  • package.jsonのパッケージを最新版にしないとエラーが出て動かなかった

 

全部おわったら、以下のコマンドでデプロイします。

# Lambdaのデプロイ
npx serverless deploy

# serverless.ymlで、Alexaスキルに関する部分を変更したときのアップデートコマンド
npx serverless alexa update

この状態で、試しにAlexa Developer Consoleの「テスト」タブで、正常に動くか確認すればいいと思います。

③LINE Message APIを登録

以下のページから登録します。

LINE Developers

④LINEグループIDの取得

LINEグループにメッセージを送りたいわけですが、そのLINEグループのIDとやらを取得する必要があります。

詳しくは以下ページに書いてます。

LINEグループのIDを確認する方法【TypeScript】

⑤Lambdaコードの編集 & serverless frameworkでデプロイ

「○○が起床したようです」というメッセージを、任意のLINEグループに送信する」という処理を書きます。

以下に書いてます。

https://github.com/penpendayo/alexa-skill-serverless-framework/blob/master/handler.ts

 

そして再度、以下のコマンドでLambdaにデプロイします。

npx serverless deploy

⑥Alexaで定型アクションの設定

スマホでAlexaアプリを開いて、以下のような設定をします。

  • 定型アクション名:
    • 任意で好きな名前を入力する
  • 実行条件を設定:
    • 「Alexaになんと話しかけたときに、この定型アクションを実行するか」の設定
    • ちなみにフレーズによってはAlexaは非常に音声認識が弱いので、複数フレーズを設定する必要があります
      • たとえば「たけしは起床」というフレーズで登録していても「武志は起床」や「タケシは起床」というように、想定と異なる文字で認識したり、そもそも「たかし起床」といった違うワードで認識したりするようです
        • ちなみに「その他」→「アクティビティ」→「音声履歴」から、今発言したフレーズをAlexaは何と認識したのか」の一覧を見れます。
      • なのでAlexaが認識しやすくて、かつ間違えにくいフレーズのほうが良いと思われます。
      • たとえばですが、「たけちゃんは起床」のようにすると、「たけちゃん」の部分は「たけちゃん」か「タケちゃん」くらいしかないと思われ、この場合は「たけちゃんは起床」と「タケちゃんは起床」の2つを登録すればいいことになります。(「たけちゃん」が認識しやすいかは不明)
  • アクションを追加:
    • 以下の2つを追加する
      • 「スマートプラグのON/OFFをする」というアクション
      • 「カスタム」というアクションで「○○は起床」というリクエストを送るアクション

 

これであとは「○○は起床」とAlexaに呼びかけるだけで、スマートプラグがON/OFFされて、LINEグループにメッセージが送信されるようになるはずです。

余談:LINE APIの改悪

全部作ってから知ったのですが、LINE APIは来月(2023年06月)から改悪されるらしいです😣

公式LINEが超改悪へ!無料メッセージ数1000→200に!有料プランもメッセージ数激減! | じゅりんHACK -IT情報館-

 

今回の自分のユースケースの場合、

4通/日・人 × 2人 × 31日=248通/月

なので、無料プランで収まりきらない模様😱

もはやLINE APIを使った無料開発はムリですね・・・。

でも無料プランの次は、5,000円/月のプランしかないので、個人開発者にはキツイものがあります。
せめてもうちょい安くしてほしい・・・。

 

というか、これなら最初からSlackかDiscordにすればよかったああああああああ。

まぁ今回の場合、serverless frameworkで開発したおかげで、コードを少しイジって、npx serverless deployってやるだけでバックエンド側のコードを修正できるんですけどね!!

やはりserverless frameworkは神!!😀

 

追記:2023年6月23日

LINEのAPIだと、20日目くらいで制限が来て送れなくなってしまったので、Discordに移行しました。

コード差分:https://github.com/penpendayo/alexa-skill-serverless-framework/commit/4316a189db8ac3ac10c9b90f2647fca9ccac89b9

 

おわり

コメント

タイトルとURLをコピーしました