ラズパイで外部からエアコンの電源を入れてみる その4

はじめに

前回からの続きです。前回はSlackの投稿を監視し特定のキーワードのチャットを送るとエアコンの電源を入れるようにしました。
今回は、毎回「エアコン」というキーワードをSlackに投稿するのが手間なため、iOS標準アプリの「ショートカット」を使用してホーム画面でアイコンをタップするのみで動作出来るようにします。

参考リンク

SlackのAPI設定

iOSの「ショートカット」アプリから、Slackにメッセージの投稿を行うためSlackのAPI設定を行います。


SlackにログインしてAPIアプリ管理画面にアクセスし、「Create an app」を選択します。


「From scratch」を選択します。


アプリ名の入力とメッセージを投稿するSlackのワークスペースを選択します。
ここでは、「iOS Shortcut Test App」という名前にしました。
「Create App」を選択すると作成するアプリの管理画面に遷移します。


画面を少し下にスクロールして「Install your app」を選択します。


「permission scope」のリンクを選択します。


画面を少し下にスクロールすると「Scopes」という項目があります。


「User Token Scopes」の「Add an OAuth Scope」から「chat:write」を選択して追加します。

※本人ではなくBotユーザとしてチャット投稿を行いたい場合、「Bot Token Scopes」の方に「chat:write」を追加します。今回はBotユーザである必要がなかったため「User Token Scopes」を使用しました


画面をスクロールして上に移動し、「OAuth Tokens for Your Workspace」の「Install to Workspace」を選択します。


「許可する」を選択します。


トークンが発行されて表示されるのでメモしておきます。これでSlackのAPI設定は完了です。

iOS「ショートカット」アプリの設定


iOSの「ショートカット」アプリを開き、ショートカットの新規作成画面に移動します。


「アクションを追加」を選択し「URL」を追加します。(URLで検索するとすぐ見つかります)

https://slack.com/api/chat.postMessage?channel={メッセージ投稿を行うチャンネル名}&text={投稿するメッセージ内容}

「URL」の欄に上記内容を設定します。

前回は、作成したBotユーザ(raspberry_pi_bot)に対して、ダイレクトメッセージで「エアコン」というメッセージを投稿しました。
しかし、Slack API経由でダイレクトメッセージを送信するのは一手間掛かるため、今回は簡単にするために事前にBotユーザを含むチャンネル(raspberrypi)を作成しました。そのチャンネルに対し「エアコン」というメッセージを投稿するようにします。


「URLの内容を取得」を追加します。(※おそらく、「次のアクションの提案」に表示されていると思います。なければ検索して追加してください)

「ヘッダ」に以下の内容を追加します。

  • キー:Authorization
  • テキスト:Bearer {SlackのAPI設定で発行されたトークン}

設定が完了したら、画面下部のメニューから「ホーム画面に追加」を選択すると、ホーム画面に追加されたアイコンをタップするだけでSlackにメッセージが投稿されます。

前回作成したSlackの投稿を監視するプログラムの修正

# coding: utf-8

import subprocess

# from slackbot.bot import respond_to
from slackbot.bot import listen_to

path='/home/pi/dev/'
irrp = path + 'irrp.py' # pigpioを使用した信号の送受信プログラム(IR Record and Playback)の保存パス
codes = path + 'codes'  # リモコンの赤外線コードを受信して保存したファイルの保存パス

# @respond_to('エアコン')
@listen_to('エアコン')
def message(message):
  # 学習したリモコンの赤外線信号をLEDから出力するコマンドを実行
  subprocess.run(["python3", irrp, "-p", "-g22", "-f", codes, "power:on"])

  # Slackにbotユーザで「エアコンの電源を入れました。」というチャットを投稿
  message.send('エアコンの電源を入れました。')

前回作成したSlack上で「エアコン」というメッセージが投稿されたか監視するプログラム(testPlugin.py)について、5~6行目、12~13行目を修正し、@respond_toを使用していた箇所を@listen_toに変更しています。

@respond_toは、Botユーザ(raspberry_pi_bot)に対して送信されたメッセージに反応します。ダイレクトメッセージと違いチェンネル投稿の場合はメンションを付けないとBotユーザに対する投稿と見なされません。

@listen_toは、Botユーザ以外に対し送信されたメッセージ(Botユーザ以外へのメンション、またはメンションのついていない投稿)に対して反応します。


iOSの「ショートカット」からSlack APIを使用してメッセージを投稿する際にBotユーザに対してメンションを付ければプログラムを修正する必要はありません。
しかし、上の画像のようにSlackのメッセージ投稿のAPIでは@{ユーザ名}を付けてメッセージを投稿してもメンション扱いにならず、作成したSlack投稿の監視プログラムも反応しません。
APIでメッセージを投稿する際にメンションを付けるには、別途APIを使用してSlackのBotユーザのユーザIDを取得し、そのユーザIDを投稿するメッセージにセットする必要があり少々手間なため、今回は対応していません。


@listen_toの場合は特にメンションを意識する必要が無いため、手動でのメッセージ投稿、iOSの「ショートカット」アプリを使用したメッセージ投稿どちらも同じ感覚で使用することが出来ます。

おわりに

今回は、iOS標準アプリの「ショートカット」を使用して、ホーム画面でアイコンをタップするのみでSlackにメッセージを投稿出来るようにしました。


--------------------------
システム開発のご要望・ご相談はこちらから

コメントを残す

メールアドレスが公開されることはありません。