SlackbotでRaspberry Pi3B+と対話形式でLEDmatrixを動かす


前回の記事の続きです。

環境

ラズパイ3B+(SDカード含む)
RGB LEDmatrix(6mmピッチ 32×32) 6枚
LEDmatrix用コネクタ
MAXWELL スイッチング電源
LEDパネル用電源コード 3本
IDCフラットケーブル 6本
ジャンプワイヤー オスメスとオスオス 50本ずつ
ブレッドボード

実現したいこと

スマホのSlackから電光掲示板の表示の切り替えを行い、ラズパイの画面操作をしなくとも簡単操作できる環境を作りたい。

Slackbotの使い方

ラズパイをSlackから操作するために、Slackbotを導入します。Slackbotを使えば、Slackに送ったメッセージに応じて、動作をさせることが可能です。

インストール

まずはSlackbotをpythonで扱うためにライブラリをインストールします。

$ sudo pip install slackbot

Botアカウントの作成

まずは新しいワークスペースをSlackで作成してください。その後、こちらのサイトからbotの作成を行ってください。「ボットインテグレーションを追加する」を押すと、APIトークンが発行されます。こちらのAPIトークンを使用します。

Botアカウントのチャンネルへの招待

Botアカウントが作成されると以下のようにAppに追加されます。
チャンネルにこのAppを招待してください。

Slackbotのディレクトリ構成

Slackbotのディレクトリの構成は以下のように設定します。slackbot_settings.pyだけはこの名前で作ってください。ほかの二つに関しては任意の名前で大丈夫です。

slackbot
    ├ bot.py #slackbotを動かす
    ├ slackbot_settings.py #Slackbotの設定
    └ botmodule.py #動作内容の記述

プログラムを記述する

slackbot_settings.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 「API_TOKEN」にはSlackから取得したAPIトークンを記述してください
API_TOKEN = "取得したAPIトークン"

# 知らない言葉をメンションされた時のデフォルトの応答
DEFAULT_REPLY = "そのようなコマンドはありません。"

# 外部ファイルを読み込む。botmodule.pyを読み込んでおく
PLUGINS = [
    'slackbot.plugins',
    'botmodule',
]

slackbot_settings.pyでは自分の取得したAPIトークンを書き込んでください。また、動作を記述したファイルもプラグインとして記述してください。DEFAULT_REPLYでは、botに対してのメンションで、登録していない言葉が届いた際の返答が設定できます。

bot.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from slackbot.bot import Bot
from slacker import Slacker
import slackbot_settings

# Botを起動する
def main():

    #ここから
    text="このチャンネルにコマンドを送ると、得点板の操作を行います。\n"\
        "以下のコマンドを送信すると、操作が可能です。\n"\
            "<コマンド名>\n→コマンド"
    sla=Slacker("取得したAPIトークン")
    sla.chat.post_message('投稿したいチャンネル名', text, as_user=True)
    #ここまでは起動時に投稿したい場合のみ記述

    bot = Bot()
    bot.run()

if __name__ == "__main__":
    main()

bot.pyを実行することでbotの動作をします。bot起動時にメッセージを送りたい場合はSlackerを使うとよいです。Slackerも取得したAPIトークンで動きます。投稿したいチャンネルを指定してください。

botmodule.py
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
from slackbot.bot import respond_to
from slackbot.bot import listen_to
import io,sys
import subprocess
import text_image_ledmatrix
#sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8')
import requests
import slackbot_settings
import time

def processmatrix():
    f=open('clear.txt')
    line=f.readline()
    while line:
        ans=line
        line=f.readline()           
    f.close()
    ans=ans.strip()
    if ans=='on':
        return True
    else:
        return False

@listen_to('-print(.*)')
def print(message, something):
        if processmatrix():
                text_image_ledmatrix.add_text('clear')
                time.sleep(3)
        message.react('ok')
        message.reply('[{0}]を表示します'.format(something))
        text_image_ledmatrix.ledprint(something)

@listen_to('-scroll(.*)')
def print(message,something):
        if processmatrix():
                text_image_ledmatrix.add_text('clear')
                time.sleep(3)
        message.react('ok')
        message.reply('[{0}]をスクロールします'.format(something))
        text_image_ledmatrix.textscroll(something)

text_image_ledmatrix.pyは前回の記事に載せています。
listen_toでチャンネル内に投稿されたメンション以外の言葉を受け取ります。()の中身の言葉を受け取った際に、動作をします。()の後半で正規表現を使っていますが、これが次の行で定義している第二の引数となります。引数が必要でない場合は正規表現はいりません。message.react()でスタンプを押します。さらにmessage.reply()で投稿に対してメンションで、反応することができます。一気に投稿するとバグが起きますので、反応があるまでは次の投稿をしないようにしてください。

Slackで動かしてみる

実際に動かしてみました。

python3 bot.py

SlackでLEDmatrixに話しかけてみます。

うまくいきました!これで簡単にLEDmatrixの表示を切り替えることができるようになりました。

参考にさせてもらったもの

今回は以下のサイトを参考にさせてもらいました。
https://qiita.com/undo0530/items/2139a1e8b73b3eee6e00/
http://www.denzow.me/entry/2017/12/16/225241/
https://qiita.com/minase_tetsuya/items/dba79cfe12db4557cefc
https://qiita.com/o_s_t/items/f05057aefb297393a69a

おわりに

今回でLEDmatrixをSlackと組み合わせることに成功しました。次回からは表示機能の多様化と電源起動時のプログラム起動についてまとめていきます。