PCやスマホのSlackからRaspberry Piにメッセージを送信します。メッセージ内容に応じた処理をラズパイに登録しておくことで、スマホからラズパイの再起動・シャットダウンといったことも可能になります。また、Node-REDからSlackにメッセージ(Emoji Icon付き)、画像ファイルを送信する方法についても記載します。スマホでラズパイを操作したい方、Slackに自動でメッセージを送信したい方はぜひお試しください。
Slackノードのインストールと事前準備
導入手順はこちら(botsを使用)とこちら(hubotを使用)に分かりやすくまとまっています。どちらか1つを導入すればよいです。また、slackノードからメッセージを送信する場合は、こちら(botsを使用)のIncoming WebHooksの手順にてWebHook URLを取得しておきます。また、Slackに画像も送信したい場合は、こちらかこちらの手順でChannel IDを取得しておきます。ありがたく参照させていただくことにして、ここでは割愛します。以上で必要なものは揃います。
実現方法
PCやスマホのSlackからRaspberry Piにメッセージを送信:
事前準備の手順に従って、Slackにbotsもしくはhubotの設定が行い、トークンを取得してあるものします。取得したトークンをSlack Bot Inノードに指定することで、PCやスマホのSlackから当該ボット宛に送信したメッセージをSlack Bot Inが受け取ることができます(メッセージはmsg.payloadに格納される)。例えばメッセージが「reboot」であれば、sudo rebootを行うexecノードを配置すれば、スマホから再起動が可能になります。
(起動時にNode-REDが自動起動する設定にしておかないと、再度スマホからrebootはできないのでご注意ください。)
また、Slack Bot Outノードにも同じトークンを指定しておくことで、Slack Bot Outに渡したmsg.payloadがボットに送信してPCやスマホから閲覧可能となります。
Raspberry PiからSlackにメッセージ(Emoji Icon付き)を送信:
slackノードにWebHook URLと「#」で始まるChannel名を指定し、msg.username, msg.emojiIcon, msg.payloadにそれぞれ表示するユーザ名、Emoji Icon, メッセージをセットした状態でslackノードにmsgを渡します。そうすることで指定のChannelにメッセージを送信して、PCやスマホから閲覧可能となります。以下はslackノードに渡すmsgを用意するfunctionノードのコードイメージです。
msg.username='user name'
msg.emojiIcon=':smile:';
msg.payload = 'メッセージ';
return msg;
(注意1)以下の「slackノードの編集」にて「Posting UserName」や「Emoji Icon」を設定していると、これらの設定値のほうがmsgで渡すmsg.usernameやmsg.emojiIconよりも優先されます。msgを使用して渡す値を切り替えたい場合は、以下の編集画面の設定値は空白にしておきます。(WebHook URLは空白ではなく設定が必要です。)
(注意2)msg.usernameは切り替えずにmsg.emojiIconのみ切り替えてメッセージ送信しても、Slack上に表示されるEmoji Iconは切り替わらないようです(同じユーザのメッセージとして連続でメッセージのみ表示される)。これはmsg.emojiIcon(もしくは編集画面の「Emoji Icon」)で指定するのがユーザのアイコンだからであり、msg.emojiIconでユーザのアイコンをメッセージごとに切り替えたい場合は、ユーザを切り替える(msg.emojiIconとmsg.usernameをセットで切り替える)ようにすればよいようです。メッセージ内に表示するEmoji Iconを切り替えたい場合はmsg.payloadに切り替えた絵文字のコードを埋め込めばよいです。
msg.payload='メッセージ:smile:'
Emoji Iconの一覧はこちらにまとまっていますので、めぼしいものをmsg.payloadに設定して表示してみるとよいかと思います。
Raspberry PiからSlackにメッセージと画像(jpg等)を送信:
これはslackノードでは実現できなさそうでしたので、pythonでコードを書き、Node-RED上のexecノードから実行します。requests.postを使用するにあたりトークンとChannel IDが必要になりますが、前述の通りトークンはbotsもしくはhubotの設定時に取得したトークン、Channel IDは「#」で始まるChannel名ではなく、別のものであることにご注意ください。(slackノードを使用した場合の送信はノードで指定したユーザからの送信、この方法の送信はトークンに対応するボットからの送信になります。)
Channel IDの確認方法とPythonコードはこちらとこちらを参照させていただきました。
また、Node-REDのフロー上で送信する画像ファイルを切り替えたい場合は、Pythonコードで
import sys
args = sys.argv
filename = args[1]
...
などで引数を取得するようにしておき、execノードは以下のようにmsg.payloadを引数に使用する旨のチェックボックスをonにしておけばよいです。execノードに対して画像ファイル名が格納されたmsg.payloadを渡せば、そのファイルをSlackに送信することができます(ファイル名は絶対パスで渡すのがよいかと思います)。
まとめ
長々と書きましたが、ポイントは以下の通りです。
- PCやスマホからRaspberry Piにメッセージを送る場合は、Slackにボットの設定とトークンの取得、Slack Bot Inノードに当該トークンを設定。
- Raspberry PiからPCやスマホ(のslack)にメッセージを送る場合は、画像を送らないのであればSlackにIncoming WebHooksの設定とWebHook URLの取得、slackノードに当該WebHook URLと「#」で始まるChannel名を設定。
- 画像も送るのであればボットのトークンと「#」で始まるChannel名とは異なるChannel IDを取得、Pythonコードを用意したうえで当該トークンと当該Channel IDを設定。
参考にしたサイト
BotsとIncoming WebHooks: node-redにSlackをつなげてみる
Hubot: 一番シンプルにSlackでbotを作る
Channel ID取得と画像送信: プログラムからSlackに画像投稿する方法まとめ
Channel ID取得と画像送信:PythonでSlackに画像をアップロードする方法
Emoji Iconリスト:Qiita/Github/Slack/Discord 絵文字一覧