経緯
前回記事の続きです。
前回はラズパイのセットアップ、回路の組み立て、エアコンの赤外線受信から送信までを行いました。
今回はslackにメッセージを送るだけでエアコンを付けられるようにします。また、それもめんどくせェのでiPhoneのショートカットアプリを用いてボタンを押すだけで付くようにします。スマホの中にリモコンを飼うことができるので、電池切れの心配とは無縁になります。
slackへの実装
botアプリの作成
slackでbotアプリを作成します。まずは、slackのワークスペースを追加しておきます。次に、slackapi のページにアクセスし、「Create New App」から「From scratch」を選択し、「App Name」を入力し、先ほど作成したワークスペースを追加して「Create App」をクリックします。
権限設定
「OAuth & Permissions」を選択します。
下にスクロールして「スコープ」の「ボットトークンのスコープ」に以下のものを追加します。(この写真ではユーザートークンのスコープも追加していますが、必要ありません)
「App Home」で「Edit」をクリック、「Display Name (Bot Name)」と「Default username」を入力します。
「OAuth & Permissions」に戻り、「install to ワークスペース名」をクリックします。
「許可する」をクリックしてbotに権限を付与します。
「xoxb-」から始まるBot User OAuth Tokenを覚えておきます。
ソケットモード設定
「Socket Mode」の「Enable Socket Mode」をオンにします。
「Token Name」は適当な名前を入力し、Generateをクリックします。
「xapp-」から始まるTokenを覚えておきます。
Event Subscriptions
「Event Subscriptions」の「Enable Events」をオンにします。
「Subscribe to bot events」で「app_mention」と「message.im」を追加します。これでbotがメンションされた場合とダイレクトメッセージで送られた場合、共に対応できるようになりました。
ラズパイの設定
前回に引き続き、ssh接続してラズパイを操作します。
まず、slack_aircon.pyというファイルを作ります。
nano slack_aircon.py
出てきた画面に以下のコードを入力します。
from slack_bolt import App
from slack_bolt.adapter.socket_mode import SocketModeHandler
import subprocess
#このtokenを持つbotに指示を与える
app = App(token="xoxbから始まるBot User OAuth Tokenを入力")
#赤外線コマンド実行とslackに返信
def process_command(text, say):
if "つけて" in text:
#gpio22からファイル名codesの中のpower:onを実行するコマンド
subprocess.run([
"python3","irrp.py","-p","-g22","-f","codes","power:on"
])
say("エアコンをつけました")
elif "消して" in text:
subprocess.run([
"python3","irrp.py","-p","-g22","-f","codes","power:off"
])
say("エアコンを消しました")
else:
say("無効なメッセージです")
#チャンネルでメンションされた時に実行
@app.event("app_mention")
def handle_mention(body, say):
text = body["event"]["text"]
process_command(text, say)
#DMで送った時に実行
@app.message("")
def handle_dm(message, say):
# Bot自身のメッセージを無視(無限ループ防止)
if "subtype" in message:
return
text = message["text"]
process_command(text, say)
if __name__ == "__main__":
#appトークンを用いてソケットモードで接続
handler = SocketModeHandler(app, "xapp-から始まるTokenを入力")
handler.start()
入力したら、Ctrl + Oで書き込み、Enterを押して保存します。Ctrl + Xで閉じます。
では、今のコードを起動してみます。以下でslack_airconを実行します。
python3 slack_aircon.py
次のように表示されます。
slackのgeneralでbotをメンションし、「つけて」と送るとエアコンがつくと思います。さらに、返信まで返してきてくれます。「消して」と送ればエアコンが消えます。
アイコンとメッセージをいじれば禪院真希の気持ちを味わうことができます。
ラズパイ起動時に自動でbotを起動
先ほどまでは「python3 slack_aircon.py」を入力してプログラムを実行していました。しかし、それではエアコンを操作するたびにちまちま入力する必要があるので、ラズパイを起動したら自動的にそのプログラムが実行されるようにしたいです。
以下を入力してラズパイを起動した際に自動的にslack待ちになるようにサービスファルを作ります。
sudo nano /etc/systemd/system/airconbot.service
表示された画面に以下を入力して、Ctrl + Oで書き込み、Enterを押して保存します。Ctrl + Xで閉じます。ユーザー名は自身のものに変更してください。
[Unit]
#ここは好きな名前
Description=Slack Aircon Bot
After=network.target
[Service]
#ユーザー名はラズパイに登録したものを使用
User=norio
#ここも「norio」を自身のユーザー名に変更
WorkingDirectory=/home/norio
#ここも「norio」を自身のユーザー名に変更
#slack_aircon.pyを実行
ExecStart=/usr/bin/python3 /home/norio/slack_aircon.py
Restart=always
[Install]
WantedBy=multi-user.target
「sudo nano /etc/systemd/system/airconbot.service」で「airconbot」という名前を付けたので、以下で設定ファイルを読み込ませます。
sudo systemctl enable airconbot
自動でプログラムが起動されるようにします。
sudo systemctl enable airconbot
今すぐスタートさせます。
sudo systemctl start airconbot
これでちまちま入力せずに、ラズパイを起動させただけでプログラムが実行されるようになりました。
iPhoneのショートカット作成
Webhook URLの取得
最後にiPhoneのショートカットを作成します。先ほどまではslackにいちいち「つけて」や「消して」を送る必要がありました。これはものすごくめんどくせェのでショートカットにして楽をします。
slackapi のページにアクセスし、「Incoming Webhooks」の「Activate Incoming Webhooks」をONにし、「Add New Webhook」をクリックします。
Workspaceとチャンネルは作成したbotが入っているところに設定し、「許可する」をクリックします。
「Webhook URL」をコピーします。あとで使います。
botのメンバーID取得
slackアプリ上で作成したbotをクリックしてメンバーIDを取得しておきます。
iPhoneのショートカット作成
新規ショートカットを開き、メニューから選択をクリックします。
名前をONとOFFにします。
URLの内容を取得を選び、ONの下に配置します。
先ほどコピーしておいたWebhook URLを貼り付けます。
方法「POST」、本文を要求を「JSON」にします。
「新規フィールドを追加」から「テキスト」を選択し、「キー」を「text」にします。「テキスト」には先ほど取得したbotのメンバーIDを用いて「<@メンバーID>つけて」と入力します。
これで、そのメンバーIDを持つbotをメンションして「つけて」と送ることができます。
OFFの場合も同様に同じURLを貼り付け、テキストに「<@メンバーID>消して」と入力します。
アイコンをホーム画面に追加し、タップすると、このようにONとOFFが選択できます。どちらかをタップすればエアコンが操作できます。
まとめ
今回はslackにメッセージを送ればエアコン制御ができ、さらにiPhoneのショートカットを導入することで、エアコンリモコンをスマホの中で飼うことができるようになりました。
今回は1種類の温度と消すことの2つの信号を学習させました。他にも、温度を上げたり風向を変更したものを学習させることにより、より快適なエアコン制御ができると思います。



















