[Raspberry Pi] NFC タグで Slack へ洗濯物・乾燥機の完了通知
以前 NFC タグを使ってコマンドを実行する方法について書いた。
[Raspberry Pi] NFC タグを使ってコマンドを実行 – with a Christian Wife
https://blog.withachristianwife.com/2019/02/17/running-command-with-nfc-tag/
[Raspberry Pi] NFC タグを使ってコマンドを実行2 – with a Christian Wife
https://blog.withachristianwife.com/2019/05/26/running-command-with-nfc-tag-2/
今回 Rasbpian Buster で同じようなことをやることにしたので、改めて丁寧にまとめてみる。
やりたいことは洗濯機と乾燥機の完了通知だ。洗濯機は40 分後、乾燥機は2時間 30 分後に完了するんだけど、洗濯機・乾燥機と離れた場所にいると完了音が聞こえないし、そもそも動かしていたことを忘れることもある。洗濯が終わった 40 分後、および乾燥が終わった2時間 30 分後に Slack へ通知するようにしたい。要するにカウントダウンタイマーだ。それを NFC タグを使ってタッチすることで簡単にタイマーをスタートさせたい。
環境:Raspberry Pi 3 Model B、Raspbian Buster、USB NFC リーダー(SONY PaSoRI RC-S380)、NFC タグ
NFC タグは以下を使った。
(0)Raspbian Buster をインストールしておく。NFC リーダーを接続する。
NFC リーダー(SONY PaSoRI RC-S380)が認識されているかの確認は以下のコマンド。
$ lsusb|grep Sony
(1)python-usb をインストール。
$ sudo apt-get install python-usb
(2)git をインストール。
$ sudo apt-get install git
(3)nfcpy をインストール。
$ git clone https://git.launchpad.net/nfcpy
参考:
Getting started — nfcpy 1.0.3 documentation
https://nfcpy.readthedocs.io/en/latest/topics/get-started.html
(4)以下のコマンドで NFC タグの待受状態にする。
$ sudo nfcpy/examples/tagtool.py
しかし、以下のようなエラーが出る。
Traceback (most recent call last):
File "nfcpy/examples/tagtool.py", line 31, in <module>
import cli
File "/home/pi/nfcpy/examples/cli.py", line 30, in <module>
import nfc
ImportError: No module named nfc
これは Python 3.7 に nfcpy がインストールされていないことによるらしい(Python3 のバージョン確認コマンドは $ pip3 —version )。なので、以下のコマンドで Python 3.7 に nfcpy をインストールする。
$ sudo pip3 install nfcpy
Python 3.7 で nfcpy を実行してみる。
$ sudo python3 nfcpy/examples/tagtool.py
これで待受状態になった。
参考:
Python3 で tagtool.py を実行する - 電気ウナギ的○○
http://blog.netandfield.com/shar/2019/08/python3-felica.html
(5)NFC タグを NFC リーダーにタッチする。
すると以下のように表示されるはずだ。
** waiting for a tag **
Type2Tag 'NXP NTAG215' ID=[文字列]
NDEF Capabilities:
readable = yes
writeable = yes
capacity = 492 byte
message = 0 byte
この ID= に続く文字列をメモしておく。
今回は洗濯機用と乾燥機用で2つの NFC タグを使うので、もう一つの NFC タグでも同じことをして ID を取得する。
(6)Slack 用の Incoming Webhook URL を以下のページで取得する。
https://slack.com/services/new/incoming-webhook
(7)以下のような Slack 投稿用のシェルスクリプトを作成し、PostToSlack.sh という名前で保存。nfcpy ディレクトリに入れる。
#! /bin/bash
url=“[6で取得した Incoming Webhook URL]”
#commandline parameter
channel=$1
message=$2
username=NFCbot
emoji=:shirt:
#assemble json payload
jsonstring="payload={\"channel\":\"$channel\",\"username\":\"$username\",\"text\":\"$message\",\"icon_emoji\":\"$emoji\"}"
#call curl
curl -X POST --data-urlencode $jsonstring $url
(8)7に実行権限を与える。
$ chmod +x PostToSlack.sh
試しに以下のコマンドで Slack に投稿されるか試してみる。投稿文は日本語も使える。Slack に投稿されれば成功だ。
$ ./PostToSlack.sh [チャンネル名] [投稿文]
(9)NFC タグをタッチしたときにフィードバックがあると、タッチが成功したことが分かりやすい。タッチで mp3 ファイルを再生するようにする。そのため、mpg321 をインストールする。
$ sudo apt-get install mpg321
音量調整は以下。
$ sudo alsamixer
nfcpy ディレクトリに bell.mp3 というベルの音声ファイルを入れておく。
(10)at コマンドをインストールしておく。
$ sudo apt-get install at
(11)以下のシェルスクリプトを作成。nfc_ready.sh というファイル名で nfcpy ディレクトリ保存する。
#! /bin/bash
while :
do
RESULT=`python3 /home/pi/nfcpy/examples/tagtool.py`
case $RESULT in
*[洗濯機用 NFC タグの ID]*)
mpg321 /home/pi/nfcpy/bell.mp3 ;
echo "./home/pi/nfcpy/PostToSlack.sh [Slackのチャンネル名] WashingMachineDone\!':shirt:' > /dev/null 2>&1" | at now +40minutes ;
sleep 15s
;;
* [乾燥機用 NFC タグの ID]*)
mpg321 /home/pi/nfcpy/Bell-sound-effect-ding.mp3 ;
echo "./home/pi/nfcpy/PostToSlack.sh [Slackのチャンネル名] DryerDone\!':shirt:' > /dev/null 2>&1" | at now +150minutes ;
sleep 15s
;;
esac
done
メモ:
・投稿文はスペースを入れるとエラーが出る。
・絵文字はアポストロフィーで囲む。
・ ! は \ でエスケープする。
・2時間 30 分は「現在から 150 分後」として指定する。
・echo "./home/pi/nfcpy/PostToSlack.sh [Slackのチャンネル名]〜の部分は echo "./nfcpy/PostToSlack.sh [Slackのチャンネル名]〜でも動くが、のちの systemd で動かす際は前者にしておく。
参考:
[iOS][Raspberry Pi] X分後にアラーム – with a Christian Wife
https://blog.withachristianwife.com/2018/12/25/alarm-in-x-minutes/
[Raspberry Pi] at コマンドの結果をメール送信しない – with a Christian Wife
https://blog.withachristianwife.com/2018/12/26/stop-mails-from-at-command/
(12)11 に実行権限を与える。
$ chmod +x nfc_ready.sh
(13)実際に動くが実験してみる。
$ sudo ./nfc_ready.sh
NFC タグをタッチすると音がなり、指定時間後に Slack へ通知されるはずだ。Ctrl + c で中止する。
(14)/etc/systemd/system/nfc_ready.service を作成し、自動起動するようにする。
[Unit]
Description=NFC Ready
[Service]
Type=simple
ExecStart=/home/pi/nfcpy/nfc_ready.sh
[Install]
WantedBy=multi-user.target
(15)以下のコマンドで systemd に登録する。
$ sudo systemctl start nfc_ready
$ sudo systemctl enable nfc_ready
不要になれば以下のコマンドで systemd から削除する。
$ sudo systemctl disable nfc_ready
$ sudo systemctl stop nfc_ready
ただ systemd から実行される at コマンドは $ at -l のジョブ一覧に表示されないようだ。
参考:
Raspberry Pi 2でNFCタグを読み取って音を鳴らす – yagi.tc
https://yagi.tc/archives/2017/03/26/raspberry-pi-2-nfc/
この記事が気に入ったらサポートをしてみませんか?