takuocean’s diary

備忘録がメインなので、説明が足りないことも多い。もう少し詳しくという人はコメントをお願いします。

RaspberryPiとGoogle AssistantのIFTTTを使った連携(1/2)

やりたいこと

RaspberryPiとGoogle AssistantをIFTTTを使って連携させる。
「音楽かけて」といったらRaspberryPiから音楽がながれるような感じ。

参考URL

qiita.com

ToDo

以下の順で指示が経由されるようにする。 GoogleAssistant → IFTTT → beebotte → RaspberryPi
今回は
「beebotte → RaspberryPi 」
を構築していく。

前提

・RaspberryPiの「/home/pi」に再生したい音楽を置く(今回はsample.mp3)
・↑を再生するアプリが入っている(今回はmpg321)

1. beebotteのセットアップ

1.1. 新しいChannelの作成

左のメニューバー上部にあるChannelsをクリックし、表示された画面で右上部にある「Create New」をクリックする。 f:id:takuocean:20190224232102j:plain

1.2. Channel名、Resource名を登録

f:id:takuocean:20190224233414j:plain ここでは Channel名:MySmartHome
Resource名:PlayMusic

入力ができたら、「Create Now」をクリックする。

1.3. トークン取得

「Create Now」をした直後にホーム画面でChannel名が表示される。
Channel名「MySmartHome」をクリックする。 f:id:takuocean:20190224234223j:plain

アクセストークンが取得することができる。 f:id:takuocean:20190224234833j:plain

1.4. beebotteの動作確認

左のメニューバーで「Account Settings」を選択し、表示された画面で「Access Management」タブをクリックする。
Secret keyをコピーする。 f:id:takuocean:20190303211337j:plain

左のメニューバーで「Console」を選択し、先ほどコピーしたSecret KeyをこのページのSercret Key入力エリアに入力する。 されに SubscribeのChannelとResourceに、先ほど登録した"MySmartHome"と"PlayMusic"を入力し、Subscribeボタンを押下する。 f:id:takuocean:20190303211343j:plain

以下のコマンドをPC上のコンソールで入力する。

curl -i -H "Content-Type: application/json" -X POST -d '{"data":"Hello World"}' http://api.beebotte.com/v1/data/publish/MySmartHome/PlayMusic?token=[Channelのトークン]

Messageエリアに指定したペイロードが表示される。

2 RaspberryPiの準備

2.1. RaspberryPiの受信プログラムの作成

指令を受けると音楽を再生するプログラム(sample.py)は以下の通り。

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

import paho.mqtt.client as mqtt
import json
import subprocess
import os

_TOKEN = 'Your Token' #IFTTTに設定したものと同じChannel Tokenを設定
HOSTNAME = 'api.beebotte.com'
PORT = 1883 #SSLの場合は8883
TOPIC = 'smart_home/music' #トピック名/リソース名 の形で設定

# 接続中の処理を記載→subscribeする
def on_connect(client, userdata, flags, respons_code):
    print('status {0}'.format(respons_code))
    client.subscribe(TOPIC)

# メッセージ受信時の処理を記載
def on_message(client, userdata, msg):
    print(msg.topic + ' ' + str(msg.payload))
    data = json.loads(msg.payload.decode("utf-8"))["data"][0]
    # Google Assistantの側でTextFiledの前後に半角スペースが入ることがあるのでstripして削除
    #data = {key:value.strip() for key, value in data.items()}
    if "room" in data.keys():
        # 「証明を」と言ってしまった際に「を」が入ってTextFieldに入ってくることがあるので削除
        #if data["device"].endswith("を"):
            #data["device"] = data["device"][:-1]
        # 日本語の表記ゆれに併せて、IFTTTのTextFieldをlightに修正
        if data["device"] != "music":
            print("unkown device")
            return
        subprocess.call(['mpg321', '/home/pi/sample.mp3'])

if __name__ == '__main__':
    client = mqtt.Client()
    #トークンを使って認証
    client.username_pw_set("token:%s"%_TOKEN)

    client.on_connect = on_connect
    client.on_message = on_message

    client.connect(HOSTNAME, port=PORT, keepalive=60)

    # 待ち受け状態にする
    client.loop_forever()

2.2. RaspberryPiの動作確認

RaspberryPiで指令がきたら音楽を再生するプログラムを実行する。

python sample.py

次に、以下のコマンドをRaspberryPiのコンソールで実行して、音楽が再生か確認。

curl -i -H "Content-Type: application/json" -X POST -d '{ "data": [{"room":"living","device": "music"}]}' http://api.beebotte.com/v1/data/publish/MySmartHome/PlayMusic?token=[Channelのトークン]

実行し音楽が流れ始めたらOK!

続き http://takuocean.hatenablog.com/entry/2019/03/25/225222