[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/

この記事が気に入ったらサポートをしてみませんか?