動機
NFCタグを使ってみたい。何ができるのか知りたい。タグに携帯をかざしてエアコン付けたり、あれこれ自動化している人たちがいる!うちでも何かやってみようというのが動機です。
NFCタグと携帯アプリ
まずここから。ひとまず、よく使われていそうなものを買いました。
包装の裏に、『かんたん設定アプリ』で設定してくださいとあるので、ダウンロード。と思ったら、Play Storeにない。日本のストアだけに限られているようだ、残念。NFCタグは汎用なので、ほかにも利用できるアプリがあるはず。探す。
NFC Toolsというアプリで読み書きができました。(ほかにもたくさん機能があり、役に立ちそうなアプリです)
さて、購入したタグを使って何をどうやるか、なのですが、最初は次のように考えました。
- 前に作ったin-and-outボードの入力部分をNFCタグスキャンにおきかえたものを作りたい。
- 誰が — (1)、出かけたのか、帰ってきたのか — (2)、に関する情報をタグに書き込んで、タグをスキャンすると携帯電話からRaspberry pi上のサーバーにhttpリクエストが送信されるようにする。
しかし、このやり方だと、家族4人に出入り2つで、合計8枚タグがいることになる。8枚使うこと自体はいいのですが、玄関の壁が見苦しい状態になるのと、ほかの人のタグを間違ってスキャンしてしまう可能性大。
少し調べてみると、タグに指令をすべて書き込まなくても、単にトリガーとして使うやり方があることがわかったので、タグからはidだけを読み込み(idはそれぞれのタグ固有のもので、最初から書き込まれている)、それに応じて実行させたい動作を自動化アプリで設定しておくことにしました。自動化アプリは、AndroidではAutomate、iPhoneでは純正のShortcutsを使うことにしました。
タグを単にトリガーとして使うなら、いってきます、おかえりなさい、の二つでよくなる。誰からの送信なのかは、各人の自動化アプリの動作設定で組み込むことにします。
方針は、
- NFCタグを2枚用意する。(何も書き込む必要はない)
- 携帯でタグをスキャンし、タグのidをメモしておく。ひとつを「いってらっしゃい」用、もうひとつを「おかえりなさい」用とする。
- 各人の携帯アプリ(AutomateかShortcuts)で動作設定を組む。動作自体はhttpリクエスト(GET)で、あらかじめ決めておいた各人のid(名前のかわり)と、スキャンしたタグのidに応じた出入りの向き情報(いってきます、か、おかえりなさい、か)をRaspberry pi上のFlaskサーバーに送信させる。
単にタグのidを使うだけで済むならば、交通機関用のカードや、Amiboなどでも代用できるようだ。
タグはそのままだと弱いので、即席「いってらっしゃい」「おかえりなさい」マークとともにヒートシーラーでパックし、扉の横に設置しました。
動作設定: Automate (Android)
Flowの全体像は以下の通り。
用いたブロックは以下の通り。
(1) NFC tag scanned
Tag type: Any
Scanned tag id: tag_id という変数でにtag idを入れることにします。
READ TAGボタンでタグのidを読み取ることができますので、それをメモしておき、次のブロックで記入します。
(2), (5) Expression True?
Formula: tag_id = “ここに上でメモしたidを記入”
tag_idは上のブロックで名付けた変数。
今回は、「いってらっしゃい」用と「おかえりなさい」用の二種類。それぞれに対応するものを記入。
(3), (6) HTTP request
Request URL: http://Raspberry piのLAN内でのIP address: PORT/nfc_in_and_outのあとに、誰なのか、inか、outかの情報をquery stringとして続ける。例えば、外出、家族id=1のひとなら、
http://RaspiのIP:PORT/nfc_in_and_out?inout=out&memberid=1
という具合です。
Request method: GET
以下のものは、Raspberry pi側(とルーター)であらかじめ設定しておく、あるいはFlask serverのコードに書いて決めておくものたちです。
- Raspberry pi のIPアドレス(ルーター側で固定しておくのが簡単で問題も少ない)
- Flask server: portと “/nfc_in_and_out” 部分
- query stringをparseするためのkeys (inout, memberid)
(4), (7), (8) Toast show
これはなくてもかまわない。動作確認のためにいれた。
それぞれのブランチの最後を (1) につないで、繰り返し処理してくれるようにしておく。
動作設定: Shourtcuts (iOS)
iPhoneは、やってみればわかる設計になっているはずだ、と思い、Shortcutsをスタートしてあれこれやっているうちに設定できた。動作としては、NFCタグをスキャン、タグに応じてURLにアクセス、の二段階。
メモを以下に少し。
- 新規オートメーション > 個人用オートメーションを作成を選ぶ
- NFCを探してタップ(下のほうにありました)
- スキャンの準備ができました、が出るのでタグにかざす
- タグの内容は読まないようだ。スキャンに名前を付ける画面がでるので入力。今回は、二つのタグにそれぞれ「in and out: IN」と「in and out: OUT」とした。
最終的なスクリーンショットを以下に示します。
外出、帰宅用、それぞれのタグに自動化動作(1)、(2)を作成した。「nfc in and out: IN」、「nfc in and out: IN」は、タグをスキャンしたときにつけた名前。
「いつ(3)」が引き金のNFCタグのスキャン、「行う(4)」が行わせたい動作。
URL(5)はRaspberry piのipアドレスとポート番号につづき、Flask serverの宛先(なんていうんでしょうか、この部分、普通のhttp serverならdirectory名にあたるところ)、あとはquery stringです。この場合、家族のメンバーid3の人が(memberid=3)返ってきた(inout=in)ことを表しています。最後に(6)URLの内容を取得、という動作をさせています。実際内容を取得する必要はなく、リクエストを送信するだけでいいのですが、今回はこれを選んで使いました。
システム全体図
(1) 外出あるいは帰宅時に該当するタグを携帯電話でスキャンする。
(2) 動作設定をしたアプリ(AutomateまたはShortcuts)が読み取ったタグに応じた情報をRaspberry pi上のFlask serverに送信。
(3)(4) 送信された内容に応じた読み上げ文章を作成。また、タイムスタンプを含む情報をデータベースに記録。帰宅時には外出時のタイムスタンプを検索して外出時間を計算。これも読み上げ文章に組み込んでもう一つのRaspberry pi(Google homeに文をよみあげてもらうためのNode-REDが動いている)に送信。
(5) Google Home miniが文章を読み上げる。
読み上げ文章の例
- ○○さんいってらっしゃい。時刻は○○時○○分です。
- ○○さんおかえりなさい。時刻は○○時○○分です。
- ○○さんの外出時間は、○○時間○○分○○秒でした。
使ってみて
試作中に、家族の一人の携帯電話にはNFC機能自体がないことが判明。とほほ。また、肝心のスキャンし忘れが頻発。また、筆者などは携帯不携帯で家をでてしまうこともしばしば。タグの前に誰かが立ったのを感知して、「タグのスキャンをお願いいたします」的なアナウンスを流すシステムがいる。。。
でも、NFCタグでいろいろできそうなことと、実際どうやればいいのか、の準備はできました。面白い使い道があったら記事にします。