SORACOM Buttonで煩悩を消す

もうすぐ2018年も終わりですね。
大晦日といえば、やはり除夜の鐘が思い浮かぶ方が多いのではないでしょうか。俗に人間の煩悩は108あり、除夜の鐘でそれを消し去って清らかな心で新年を迎えられるように打ち鳴らされている、とも言われています。

しかし年末年始も忙しく、鐘をつきに行く時間が無いという方も多いかもしれません。
そんな方のために、SORACOM LTE-M Buttonを押すとGoogle Homeから除夜の鐘の音がする仕掛けをつくりましたのでご紹介します。

アーキテクチャ

こんな感じにしてみました。
SORACOM LTE-M ButtonからAWS IoT 1-Clickを経由してAWS Lambdaを呼び出すところまでは先日の記事(会議脱出ボタン)と同じとなります。

Google Homeを使った仕組みは以前にも3つ記事を公開していますが、いずれも音声発話をきっかけ何かしらの処理を実行するものでした。

音声でSORACOM SIMの状態を変更する
スマートスピーカーのGoogle Home(Mini)を購入しました。 クラウドと連携させ、SORACOM SIMの回線状態を音声で変更するアプリケーションを作成してみました。
音声でWioLTEのLED発光色を変更する
Google Homeからの音声操作でWioLTEのLEDの発光色を変更してみます。 (SORACOM UG #10 LT発表内容)
SORACOMの料金を音声で確認する
SORACOMの料金を音声(Google Home)で確認するアプリをActions on Google + Dialogflowで作成してみました。

今回は音声での呼び出し無しにGoogle Homeから鐘の音を鳴らすため、ローカルネットワーク内にgoogle-home-notifierを設置します。google-home-notifierをインターネット上にあるngrokサービスと紐付けることで、Lambdaからの呼び出しで動作するようになります。

設定方法

ngrokサービスへの登録

ngrokへの登録を行わない場合、セッション時間が8時間までしか保持されない制約があるため登録を行っています。(登録は必須ではありません)

ngrokサービスに登録します。ngrokにアクセスしサインアップします。

私はGoogleアカウントでサインアップしました。

続いてDashboardのAuthを開き、自身のTunnel Authtokenを控えておきます。

 

Google HomeのIPアドレス確認

続いてローカルネットワーク内にあるGoogle HomeのIPアドレスを調べます。
スマートフォンのGoogle Homeアプリケーションを開き、対象のGoogle Homeデバイスを開きます。

デバイスの画面が開きますので、設定アイコンをクリックします。

設定画面が開きます。
一番下にIPアドレスが表示されていますので、これを控えます。

除夜の鐘の音の準備

鐘の音(mp3データ)にはポケットサウンドが提供している無料素材を利用させていただきました。

【効果音】除夜の鐘 - ポケットサウンド - フリー効果音素材・BGMダウンロード

これをダウンロードし、Webアクセス可能な場所に設置します。

google-home-notifierのインストール

いよいよgoogle-home-notifierのインストールを行います。
なお当方ではローカルネットワーク内にLinuxマシンがあり、これを利用しましたがRaspberry Piでも代用できます。

インストール方法は以下のブログ記事を参考にさせていただきました。

Node.js環境の構築

# yum install avahi-compat-libdns_sd-devel
# curl -sL https://rpm.nodesource.com/setup_8.x | bash
# yum install nodejs
# node -v
v8.14.0
# systemctl start avahi-daemon
# systemctl enable avahi-daemon

google-home-notifierのインストール

$ git clone https://github.com/noelportugal/google-home-notifier
$ cd google-home-notifier
$ npm install

なお、当方の環境では “get key failed from google” エラーが発生したため、こちらの記事を参考に修正を行いました。

テスト

以下のようなコードを設置し、実行してみます。

// 定義
var googlehome = require('./google-home-notifier');
var deviceName = '(GoogleHomeの登録名)';
var ipAddress  = '(GoogleHomeのIPアドレス)';
var language   = 'ja';
var mp3url     = 'https://(mp3データのURL)';

// ライブラリ初期化
googlehome.device(deviceName, language);
googlehome.ip(ipAddress, language);

// mp3を再生する
googlehome.play(mp3url, function(notifyRes) {
  console.log(notifyRes);
});
$ node test.js

起動音の後に鐘の音がしたら成功です。

ngrok連携

ngrokと紐付け、外部から呼び出せるようにします。
以下のようなコードを設置します。

// 定義
var googlehome = require('./google-home-notifier');
var deviceName = '(GoogleHomeの登録名)';
var ipAddress  = '(GoogleHomeのIPアドレス)';
var language   = 'ja';
var mp3url     = 'https://(mp3データのURL)';

// ngrokパラメータ
var ngrok      = require('ngrok');
var express    = require('express');
var app        = express();
var serverPort = 8091;
var token      = '(ngrokのTunnel Authtoken)';

// GETリクエスト時
app.get('/', function (req, res) {

  // ライブラリ初期化
  googlehome.device(deviceName, language);
  googlehome.ip(ipAddress, language);

  // mp3を再生する
  googlehome.play(mp3url, function(notifyRes) {
    res.send(notifyRes);
  });
})

// サーバ起動
app.listen(serverPort, function () {
  ngrok.connect({authtoken: token, addr: serverPort}, function (err, url) {
    // エンドポイント表示
    console.log('Endpoints: ' + url);
  });
})

以下のように作成したコードを実行し、常駐させます。
ngrokのURLが表示されます。

$ node ghome-notifier.js &
Endpoints: https://xxxxxxxx.ngrok.io

表示されたURLにブラウザでアクセスし、GoogleHomeから鐘の音がしたら成功です。

ngrokのURLはGoogle-Home-Notiferの起動ごとに変動します。

Lambda関数の設置

いよいよ、ngrokのURLにリクエストを送るLambda関数を設置します。
今回はPython 3.7にて作成を行いました。


ソースコードはこれだけ

import os
import urllib.request

def lambda_handler(event, context):
    url = os.environ.get('mp3url')
    req = urllib.request.Request(url)
    res = urllib.request.urlopen(req)
    body = res.read().decode("utf-8")
    res.close()

    return {
        'statusCode': 200,
        'body': body
    }

環境変数としてngrokのURLを渡すようにしました。
また、実行時間は3秒では足りないようで5秒に延ばしました。

ngrokのURLが変わる度に環境変数を変更する必要があります。

AWS IoT 1-Clickの設定

SORACOM LTE-M ButtonをAWS IoT 1-Clickへ登録

以前の記事と重複するので割愛します。

プロジェクト設定

AWS IoT 1-Clickのプロジェクト設定を行います。
AWS IoT 1-CLickのトップページからプロジェクトの作成、をクリックします。

次に適宜プロジェクト情報を入力します。

続けてLambda関数との紐付けを行います。

プレイスメント設定

最後にプレイスメント設定にてボタンとの紐付けを行います。

これで一連の設定は完了です。

まとめ

SORACOM LTE-M ButtonをクリックするとGoogle Homeから除夜の鐘の音がするようになりました。

ボタンをお持ちの皆さん、ぜひ年内に108回押して煩悩を消し去り、清らかな心で新年を迎えてはいかがでしょうか。

皆様2019年も良い年でありますようにお祈りしております。
来年もよろしくお願いします。

コメント