かつをメモ

自分が書いたプログラムなど色々投稿していきます。

Google Home MiniからIFTTTを経由し、Slackに投稿してPS4を操作する

こんばんは、かつをです。
今回はGoogle Home MiniからIFTTTを経由してSlackに投稿して、slackbotが投稿内容を見てPS4を操作する、といったことをしたいと思います。slackbotをRaspberry Piに実装し、ラズパイからPS4を操作できるようにします。

過去記事

katsuwoo.hatenablog.com katsuwoo.hatenablog.com

機材

  1. Google Home Mini
  2. Raspberry Pi 3 Model B

IFTTTの設定

過去(Google Home Mini -> IFTTT -> Slackに投稿する - かつをメモ)にSlackbotを動かしてみたので、詳細はそちらを参照してください。

今回は[Say a simple phrase]を選択します。

f:id:katsuwoo:20180924170648p:plain

以下のように設定しました。

f:id:katsuwoo:20180925010911p:plain

f:id:katsuwoo:20180925010943p:plain

ちなみに上図は起動用の設定です。停止用は以下となります。

f:id:katsuwoo:20180925011045p:plain

f:id:katsuwoo:20180925011059p:plain

上記ではチャンネルに投稿していますが、ダイレクトメッセージでbot宛にメッセージを送っても正常に動作します。どちらでも動作は変わりません。上記ではチャンネルに送信していますが、後々ダイレクトメッセージで送るようにしました。

slackbotライブラリの編集

実は上記のままだと正常に動きません。IFTTTからslackに投稿しても、slackbotが全然反応してくれないのです。ここでかなり詰まりました。調べてみると、以下のようなサイトを見つけました。

hiro99ma blog: [googlehome]IFTTTのThatをslackbotで受けとる

IFTTT用 · hirokuma/slackbot@c04aa03 · GitHub

dispatcher.pyを探します。pythonで対話型モードにして、dispatcher.pyのパスを聞き出します。

$ python
>>> from slackbot import dispatcher
>>> dispatcher.__file__

これでdispatcher.pyの場所がわかります。

ちなみに上記の修正をしてみましたが、完全には正常に動いてくれませんでした。以下のようにコードを修正したところ、ちゃんと動きました。

    def _dispatch_msg_handler(self, category, msg):
        responded = False
        # for func, args in self._plugins.get_plugins(category, msg.get('text', None)):
        for func, args in self._plugins.get_plugins(category, msg['attachments'][0].get('pretext', None)):
            if func:
                responded = True
                try:
                    func(Message(self._client, msg), *args)
                except:
                    # logger.exception(
                    #     'failed to handle message %s with plugin "%s"',
                    #     msg['text'], func.__name__)
                    logger.exception(
                        'failed to handle message %s with plugin "%s"',
                        msg['attachments'][0]['pretext'], func.__name__)
                    # reply = u'[{}] I had a problem handling "{}"\n'.format(
                    #     func.__name__, msg['text'])
                    reply = u'[{}] I had a problem handling "{}"\n'.format(
                        func.__name__, msg['attachments'][0]['pretext'])
                    tb = u'```\n{}\n```'.format(traceback.format_exc())
                    if self._errors_to:
                        self._client.rtm_send_message(msg['channel'], reply)
                        self._client.rtm_send_message(self._errors_to,
                                                      '{}\n{}'.format(reply,
                                                                      tb))
                    else:
                        self._client.rtm_send_message(msg['channel'],
                                                      '{}\n{}'.format(reply,
                                                                      tb))
        return responded

上記で動きました。

MacBook AirからRaspberry Piにslackbotのディレクトリ構造をコピーする(必要であれば)

自分はMacBook Airで動作確認をしたので、slackbotのスクリプトをそのままRaspberry Piにコピーします。Raspberry Piのnode.js, npmの環境セットアップはここを参考にしてみてください。わかりやすいです。

以下のコマンドを実行します。

$ scp -P 22 -r slackbot pi@192.168.10.108:~

以上でslackbotのディレクトリをそのまま送信できます。Raspberry Pi側でslackbotをインストールします。

$ pip3 install slackbot

また、dispatcher.pyも編集したので送る必要があります。上記のようにdispatcher.pyを探しましょう。上記と違いpython3で立ち上げて探します(pip3でインストールしているため)

$ python3
>>> from slackbot import dispatcher
>>> dispatcher.__file__
'/home/pi/.local/lib/python3.5/site-packages/slackbot/dispatcher.py'

パスがわかったら、以下のコマンドを実行してdispatcher.pyを送ります。

$ scp -P 22 dispatcher.py pi@192.168.10.108:/home/pi/.local/lib/python3.5/site-packages/slackbot/dispatcher.py

あとはmy_mention.pyを以下のように修正しましょう。subprocess.callでps4-wakerコマンドを実行している部分に関して、sudoを追加しないと動きません。

@listen_to('PS4起動')
@respond_to('PS4起動')
def wake_ps4(message):
    subprocess.call('sudo ps4-waker', shell=True)
    message.send('PS4を起動')

@listen_to('PS4停止')
@respond_to('PS4停止')
def standby_ps4(message):
    subprocess.call('sudo ps4-waker standby', shell=True)
    message.send('PS4を停止')

これで動きます。以下のコマンドを実行して完了です。

$ cd ~/slackbot
$ python3 run.py

これでGoogle Home Miniから動かすことができました。