Raspberry Pi のタクトスイッチ(複数個)を押すと Slack に通知する

Raspberry Pi のタクトスイッチを押すことで Slack に定型文を投稿できるようにしたい。タクトスイッチは4つぐらい設置してそれぞれに定型文を割り当てたい。これに挑戦してみることにした。

今回は4つのタクトスイッチを使い、それぞれ別の定型文を Slack に投稿できるようにしたいが、単純なメッセージ送信だけでなく、時刻や指定時間後のように時間を指定したメッセージ送信を行いたい。

環境:Raspberry Pi 3 Model B、Raspbian Stretch

(1)配線は『ラズベリー・パイで遊ぼう!』(p257)と全く同じ。

TactSwitchToSlack-20180228

タクトスイッチはブレッドボードに刺す向きを注意しよう。

タクトスイッチは向きに注意|文系の伊藤さんと電気の話
https://ameblo.jp/bun-ito/entry-12259611903.html

(2)以下のページで Slack の Incoming Webhook 用 Webhook URL を取得する。

https://slack.com/services/new/incoming-webhook

(3)時間を指定した投稿用のシェルスクリプトを作成する。といっても以下のようなシンプルなものだ。slack-post.sh とでも名前を付けておこう。

1#!/bin/sh
2curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]

(2018-12-03 追記: [チャンネル名] 等の [ と ] はコードから除いてください。)

bot アイコンは以下のページが参考になる。

Emoji cheat sheet for GitHub, Basecamp and other services
https://www.webpagefx.com/tools/emoji-cheat-sheet/

(4)時間指定投稿用に at コマンドのインストールもしておく。

$ sudo apt-get install at

三浦さんちのブログ: Raspberry PiのLinux、Raspbian atコマンドで学んだshとbashの問題
http://smiura3000.blogspot.jp/2016/04/raspberry-pilinuxraspbian-atshbash.html

(5)同じディレクトリに、投稿用の以下のようなシェルスクリプトを作成する。TactSwitchToSlack.sh とでも名前を付けておこう。

 1#!/bin/sh
 2
 3PORT1=18
 4PORT2=23
 5PORT3=24
 6PORT4=25
 7
 8sleep 30s
 9
10for port in $PORT1 $PORT2 $PORT3 $PORT4 ; do
11  gpio -g mode $port in
12  gpio -g mode $port down
13done
14
15while true ; do
16
17  if [ `gpio -g read $PORT1` -eq 1 ] ; then
18    curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]
19  fi
20
21  if [ `gpio -g read $PORT2` -eq 1 ] ; then
22    curl -X POST --data-urlencode "payload={\"channel\": \"#[チャンネル名]\", \"username\": \"[botの名前]\", \"text\": \"[投稿内容]\", \"icon_emoji\": \"[bot アイコン]\"}" [2の Webhook URL]
23  fi
24
25  if [ `gpio -g read $PORT3` -eq 1 ] ; then
26    at now +40minutes -f ./home/pi/slack-post.sh
27  fi
28
29  if [ `gpio -g read $PORT4` -eq 1 ] ; then
30    at 17:30 -f ./home/pi/slack-post.sh
31  fi
32
33  sleep 0.2
34done

タクトスイッチの割り当ては以下。時間指定の場合だけ、3の外部のシェルスクリプトを呼び出すようにした(同一シェルスクリプト内に書く方法が分からなくて・・・)。

タクトスイッチの割り当て
・GPIO 18:Slack へ定型文を投稿1
・GPIO 23:Slack へ定型文を投稿2
・GPIO 24:40 分後に Slack へ3の定型文を投稿
・GIPO 25:17:30 にSlack へ3の定型文を投稿

起動時に 30 秒間 sleep させているのは、そうしないと時々連続投稿が始まって暴走状態になるから。理由はよく分からない。

最後の sleep 0.2 は 0.1 だと連続投稿になってしまうことが多かったから。

at で指定するシェルスクリプトは絶対パスで記述する。

【at】Linuxで指定した時刻にジョブを実行する | UX MILK
http://uxmilk.jp/53442

Linuxコマンド【 sleep 】指定した時間だけ処理を遅延 – Linux入門 – Webkaru
https://webkaru.net/linux/sleep-command/

(6)3と5のシェルスクリプトに実行権限を与える。

$ sudo chmod 735 slack-post.sh
$ sudo chmod 735 TactSwitchToSlack.sh

(7)実行してみよう。

$ ./TactSwitchToSlack.sh

タクトスイッチを押すと Slack に投稿されるはずだ。Ctrl + c で終了できるが、時間指定の投稿に関しては at のキューに登録されているので、指定時間になったら投稿される。

(8)Raspberry Pi 起動時にシェルスクリプトを開始したいので、/etc/rc.local というファイルを編集する。

exit 0 より前に以下を追加しよう。以下のように絶対パスで記入しないとうまく動かなかった。

./home/pi/TactSwitchToSlack.sh

参考:
Raspberry Piでプログラムを自動起動する5種類の方法を比較・解説
http://hendigi.karaage.xyz/2016/11/auto-boot/